我们知道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)
遇到这个问题,有几种可能,我在下面详细的列出来,方便大家在遇到的时候查看
· 多线程访问造成的数据库锁定。使用synchronized 关键字来修饰获取数据库连接的方法,或者使用 isDbLockedByOtherThreads方法判断数据库是否被锁住了,然后等待一定的时间再进行访问。public static synchronized DBConnection getConnection(String connectionName) throws Exception { String pathFile = getPath() + connectionName;// 转换目录data下 return new DBConnection(SQLiteDatabase.openDatabase(pathFile, null, SQLiteDatabase.OPEN_READWRITE)); }