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

我们知道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数据不完全是线程安全的,导致在一些地方会莫名其妙的出问题,如果遇到这样的情况,那只能不要将断点打到数据库连接的地方了。
 
 
 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值