1.Android多线程下操作sqlite数据库

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zxl1173558248/article/details/81120452

当你在多线程中只使用一个SQLiteDatabase的引用时,需要格外注意你SQLiteDataBase.close()调用的时机,因为你是使用的同一个引用,比如在一个线程中当一个Add操作结束后立刻关闭了数据库连接,而另一个现场中正准备执行查询操作,但此时db已经被关闭了,然后就会报异常错误。此时一般有三种解决方案,

①简单粗暴给所有的CRUD添加一个 synchronized关键字;

②永远不关闭数据库连接,只在最后退出是关闭连接。其实每次执行getWriteableDataBase()或getReadableDatabase()方法时,如果有已经建立的数据库连接则直接返回(例外:如果旧的连接是以只读方式打开的,则会在新建连接成功的前提下,关闭旧连接),所以程序中将始终保持有且只有一个数据库连接(前提是单例),资源消耗的很少。

③可以自己进行引用计数,简单示例代码如下:

//打开数据库方法
public synchronized SQLiteDatabase openDatabase() {
if (mOpenCounter.incrementAndGet() == 1) {
  // Opening new database
  try {
    mDatabase = sInstance.getWritableDatabase();
  } catch (Exception e) {
    mDatabase = sInstance.getReadableDatabase();
    }
  }
return mDatabase;
}

//关闭数据库方法
public synchronized void closeDatabase() {
  if (mOpenCounter.decrementAndGet() == 0) {
  // Closing database
  mDatabase.close();
  }
 }

还有一些比较好的习惯和常识,例如关闭Cursor,使用Transaction,SQLite存储数据时其实不区分类型,以及SQLite支持大部分标准SQL语句,增删改查语句都是通用的等等。

猜你喜欢

转载自blog.csdn.net/zxl1173558248/article/details/81120452