Android sqlite 操作最佳实践及其注意事项

1、同一个Helper每次调用getWriteableDataBase实质上是返回的同一个DataBase,若在多次调用getWriteXXXX 不会报错,而是直接返回了之前已经打开的database,如果检测到DataBase已经被关闭了,则新打开一个DataBase并返回。

     ss.png  
 
  
  2、要支持多个线程同时去操作数据库,必须要用到同一个连接。
     例如有2个helper都会去getDataBase,他们得到的连接是2个不同的对象。
           // Thread 1
        SQLiteDatabase database = getWriteDatabaseXXX()   
        database.insert(…); // CRUD操作
        database.close();//关闭
        
        // Thread 2
        SQLiteDatabase database = getWriteDatabaseXXX()   
        database.delete(…); // CRUD操作
        database.close();//关闭

      结果: 某个线程会操作失败,并报异常: android.database.sqlite.SQLiteDatabaseLockedException: database is locked
       原因:  是我们使用了不同的数据库连接。

  3、在异步的环境下,用同一个连接也会产生问题, 比如2个线程都在去操作数据库。
    
           SQLiteDatabase  singelDataBase ; // 唯一的
        // Thread 1
        SQLiteDatabase database =  singelDataBase  ;
        database.insert(…); // CRUD操作
        database.close();//关闭
        
        // Thread 2
        SQLiteDatabase database = singelDataBase ;
        database.delete(…); // CRUD操作
        database.close();//关闭
        
     第一个线程执行完毕后,就会关掉连接,第二个再去执行的时候,就会报  attempt to re-open an already-closed object: SQLiteDat abas
    解决办法: 
    1、 一直不关闭这个连接,直到App destory的时候,才去关闭连接。 但是这样会  Caused by: java.lang.IllegalStateException: SQLiteDa         tabase created and never closed 一直会 出现此警告,肯定不值得推荐 。同时如果该Helper一直没关闭连接(DataBase ) ,当垃圾回收的时候,会报 Close() was never explicitly called on databse 错误。以下是垃圾回收代码截图
     ll.png
    2、 需要手动程序控制,当没有其他操作在使用这个连接的时候,才真正的去关闭该连接,利用(AtomicInteger)
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值