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

来源:互联网 发布:淘宝全民晒单推广 编辑:程序博客网 时间:2024/06/08 08:59
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: SQLiteDatabas
    解决办法: 
    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
原创粉丝点击