Android:SQLite无法update/insert/delete数据(数据库被locked)

时间:2024-01-14 17:31:38
  1. //在频繁范围数据库进行读写操作后,会发生增删改数据都无效的问题,查询一般正常。
  1. mDatabase.beginTransaction();
  2. try
  3. {
  4. Log.v(TAG,"locked:"+mDatabase.isDbLockedByCurrentThread());//true
  5. //Log.v(TAG,"locked2:"+mDatabase.isDbLockedByOtherThreads());//false
  6. mDatabase.execSQL(sql);
  7. mDatabase.setTransactionSuccessful();
  8. }
  9. finally
  10. {
  11. mDatabase.endTransaction();
  12. }

原因是数据库被锁定了。

在每次操作数据库之前(一般是增删改对数据库进行写操作时受影响,query不影响),检查锁定状态。

每次操作数据库,按下面较完整的操作进行

  1. private static String Lock = "dblock";
  1. private static void executeSQL(final String sql)
  2. {
  3. SQLiteDatabase db = getDatabase();//注意每次操作数据库前都要调用这个函数,以获得有效的未被锁定的db,调试时可以在这句之前加入检测是否被locked来分析问题
  4. synchronized (Lock)
  5. {
  6. db.beginTransaction();
  7. try
  8. {
  9. db.execSQL(sql);
  10. db.setTransactionSuccessful();
  11. }
  12. finally
  13. {
  14. db.endTransaction();
  15. }
  16. }
  17. }
  1. private static SQLiteDatabase getDatabase()
  2. {
  3. while (mDatabase.isDbLockedByCurrentThread()
  4. || mDatabase.isDbLockedByOtherThreads())
  5. {
  6. // Log.v(TAG,"getDatabase locked.");
  7. // db is locked, keep looping
  8. }
  9. return mDatabase;
  10. }
  1. <span style="white-space:pre"></span><pre></pre>
  2. <pre></pre>