SQLiteDatabaseLockedException

错误日志:

android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode
at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
at com.ivcar.weibo.support.database.FriendsTimeLineDBTask.getWsd(FriendsTimeLineDBTask.java:50)

遇到这个问题,有以两种可能:
(1)多线程访问造成的数据库锁定。
如A线程在访问当前的数据库,这时候B线程也需要访问数据库,这样在B线程中,就会有类似以上的异常产生,我们需要将提供数据库访问的方法设置成同步的,防止异步调用时出现问题,如在调用方法中增加 synchronized 修饰符。
使用synchronized 关键字来修饰获取数据库连接的方法,或者使用isDbLockedByOtherThreads方法判断数据库是否被锁住了,然后等待一定的时间再进行访问。
参考:http://bbs.9ria.com/thread-247178-1-1.html
(2)执行事务操作未正常关闭。
如下面代码,使用事务操作数据库,但事务执行完成后未调用db.endTransaction();关闭事务。
//获取行业列表

public ArrayList GetIndustryList(){

ArrayList IndustryList=new ArrayList();

SQLiteDatabase db=openDatabase();

db.beginTransaction();

Cursor cursor = db.rawQuery(

"select * from dcIndustry",

null);

while(cursor.moveToNext()){

IndustryList.add(new Industry(cursor.getString(0),cursor.getString(1)));

}

db.close();

return IndustryList;

}

Android 4.0以前的版本db.close();会结束事务,而Jelly Bean 以后的版本因为安全性的问题,必须结束即endTransactiony以后才能再次访问本地数据库。
(3)sqlite自身的问题
有时我们会在调试程序的时候发现Log控制台频繁的出现上述异常,而在运行程序的时候就没有这个问题,这种现象我在调试ResultSet时也会出现,查资料找原因是因为sqlite数据不完全是线程安全的,导致在一些地方会莫名其妙的出问题,如果遇到这样的情况,那只能不要将断点打到数据库连接的地方了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章