我遇到以下错误。那么如何解锁数据库?
10-28 08:43:26.510: ERROR/AndroidRuntime(881): FATAL EXCEPTION: Thread-11
10-28 08:43:26.510: ERROR/AndroidRuntime(881): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:742)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at com.aa.me.vianet.dbAdapter.DbAdapter.open(DbAdapter.java:25)
10-28 08:43:26.510: ERROR/AndroidRuntime(881): at com.aa.me.vianet.services.NotificationManagerThread.run(NotificationManagerThread.java:49)
SQLite
在数据库写入数据库时将其锁定,以避免在另一个实体尝试同时写入同一数据库时损坏数据库。 Android,只会在log cat中显示一个错误,而您提供的查询将被遗忘...所以,我建议:
SQLOpenHelper
访问数据库endTransaction()
结束交易http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection
有关更多信息,请检出此blogpost。
db.beginTransactionNonExclusive();
try {
//do some insertions or whatever you need
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
我尝试使用db.beginTransaction,但它锁定了bd
ContentResolver
访问数据库相同的问题,而我已经对其建立了直接的SQLiteDatabase
直接连接(交易需要)。我通过更改代码的顺序来解决它,以便在打开直接的ContentResolver
连接之前完成SQLiteDatabase
的工作。
我还删除了一些代码,所以我不再关闭直接的SQLiteDatabase
。
值得阅读this answer,因为它提供了许多其他有用的指导。