//在频繁范围数据库进行读写操作后,会发生增删改数据都无效的问题,查询一般正常。
mDatabase.beginTransaction();
try
{
Log.v(TAG,"locked:"+mDatabase.isDbLockedByCurrentThread());//true
//Log.v(TAG,"locked2:"+mDatabase.isDbLockedByOtherThreads());//false
mDatabase.execSQL(sql);
mDatabase.setTransactionSuccessful();
}
finally
{
mDatabase.endTransaction();
}
原因是数据库被锁定了。
在每次操作数据库之前(一般是增删改对数据库进行写操作时受影响,query不影响),检查锁定状态。
每次操作数据库,按下面较完整的操作进行
private static String Lock = "dblock";
private static void executeSQL(final String sql)
{
SQLiteDatabase db = getDatabase();//注意每次操作数据库前都要调用这个函数,以获得有效的未被锁定的db,调试时可以在这句之前加入检测是否被locked来分析问题
synchronized (Lock)
{
db.beginTransaction();
try
{
db.execSQL(sql);
db.setTransactionSuccessful();
}
finally
{
db.endTransaction();
}
}
}
private static SQLiteDatabase getDatabase()
{
while (mDatabase.isDbLockedByCurrentThread()
|| mDatabase.isDbLockedByOtherThreads())
{
// Log.v(TAG,"getDatabase locked.");
// db is locked, keep looping
}
return mDatabase;
}