分享

SQLiteException: database is locked异常的解决办法

 Sundy工作室 2013-07-25

我们知道Android系统支持sqlite数据库,使用Android系统访问sqlite数据库时,有时可能会遇到android.database.sqlite.SQLiteException: database is locked异常,例如

06-29 13:17:12.415: E/Database(10064): CREATE TABLE android_metadata failed 06-29 13:17:12.455: E/Database(10064): Failed to setLocale() when constructing, closing the database 06-29 13:17:12.455: E/Database(10064): android.database.sqlite.SQLiteException: database is locked 06-29 13:17:12.455: E/Database(10064): at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method) 06-29 13:17:12.455: E/Database(10064): at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1987) 06-29 13:17:12.455: E/Database(10064): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1855) 06-29 13:17:12.455: E/Database(10064): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:820)

遇到这个问题,有几种可能,我在下面详细的列出来,方便大家在遇到的时候查看

多线程访问造成的数据库锁定。
   如A线程在访问当前的数据库,这时候B线程也需要访问数据库,这样在B线程中,就会有类似以上的异常产生,我们需要将提供数据库访问的方法设置成同步的,防止异步调用时出现问题,如:

public static synchronized DBConnection getConnection(String connectionName) throws Exception { String pathFile = getPath() connectionName;// 转换目录data下 return new DBConnection(SQLiteDatabase.openDatabase(pathFile, null, SQLiteDatabase.OPEN_READWRITE)); }

使用synchronized 关键字来修饰获取数据库连接的方法,或者使用isDbLockedByOtherThreads方法判断数据库是否被锁住了,然后等待一定的时间再进行访问。
sqlite自身的问题
有时我们会在调试程序的时候发现Log控制台频繁的出现上述异常,而在运行程序的时候就没有这个问题,这种现象我在调试ResultSet时也会出现,查资料找原因是因为sqlite数据不完全是线程安全的,导致在一些地方会莫名其妙的出问题,如果遇到这样的情况,那只能不要将断点打到数据库连接的地方了。
 
 
 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多