SQLiteDatabaseLockedException

来源:互联网 发布:php实现硬件设备对接 编辑:程序博客网 时间:2024/05/21 02:33

错误日志:

android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_modeat 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数据不完全是线程安全的,导致在一些地方会莫名其妙的出问题,如果遇到这样的情况,那只能不要将断点打到数据库连接的地方了。

0 0