我正在使用sqlite编写一个android应用程序。有很多 Activity 和一项服务。我从多个线程中使用数据库。它可以在Android 2.X中完美地工作,但是一旦我在Android 3.X中运行它,它总是会抛出此错误和Force Close:

05-04 22:17:04.815: I/SqliteDatabaseCpp(8774): sqlite returned: error code = 5, msg = database is locked, db=/data/data/xxx/databases/im
05-04 22:17:04.815: E/SqliteDatabaseCpp(8774): sqlite3_open_v2("/data/data/xxx/databases/im", &handle, 6, NULL) failed
05-04 22:17:04.835: E/SQLiteDatabase(8774): Failed to open the database. closing it.
05-04 22:17:04.835: E/SQLiteDatabase(8774): android.database.sqlite.SQLiteDatabaseLockedException: database is locked
05-04 22:17:04.835: E/SQLiteDatabase(8774):     at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
05-04 22:17:04.835: E/SQLiteDatabase(8774):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
05-04 22:17:04.835: E/SQLiteDatabase(8774):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
05-04 22:17:04.835: E/SQLiteDatabase(8774):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:1021)
05-04 22:17:04.835: E/SQLiteDatabase(8774):     at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:790)
05-04 22:17:04.835: E/SQLiteDatabase(8774):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:221)
05-04 22:17:04.835: E/SQLiteDatabase(8774):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:149)

谁知道它为什么会发生以及如何解决?

我在互联网上进行了研究,大多数人建议:
  • 仅对应用程序使用一个数据库连接。如何保证呢?我想共享服务和 Activity 的数据库连接。我应该通过创建公共(public)静态数据库变量来做到这一点吗?
  • ContentProvider-我在代码中使用了复杂的SQL语句(例如联接几个表,临时表)。是否可以在ContentProvider中运行这些复杂的SQL语句?

    谢谢大家。最后,(1)对我来说很好。但是我仍然想知道为什么Android 2.X没有这个问题。
  • 最佳答案

    答案是1。我有几个堆栈答案和有关如何做到这一点的博客文章:

    What are the best practices for SQLite on Android?

    http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection

    2号是很多额外的工作,并且是不必要的。存在ContentProvider,因此您可以与其他应用共享数据。它用于管理数据库连接,因为人们不了解Sqlite和Android如何协同工作。

    10-07 19:05
    查看更多