我正在编写一个 Android 应用程序,使用sqlite
。有多种活动和一项服务。我从多个线程使用数据库。它完美地工作在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)
有谁知道为什么会发生以及如何解决它?
我在互联网上进行了研究,大多数人都建议:
- 仅对应用程序使用一个数据库连接。如何保证呢?我想共享服务和活动的数据库连接。我应该通过创建公共静态数据库变量来做到这一点吗?
- ContentProvider - 我在代码中使用复杂的 SQL 语句(例如连接几个表、临时表)。是否可以在ContentProvider中运行这些复杂的SQL语句?
谢谢大家。最后,(1)对我来说效果很好。但我还是想知道为什么Android 2.X没有这个问题。
1号就是答案。我有几个关于如何做到这一点的堆栈答案和博客文章:
Android 上 SQLite 的最佳实践是什么? https://stackoverflow.com/questions/2493331/what-is-best-practice-with-sqlite-and-android/3689883#3689883
http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection
第二点是很多额外的工作,而且是不必要的。 ContentProvider 的存在是为了让您可以与其他应用程序共享数据。它用于管理数据库连接,因为人们不了解 Sqlite 和 Android 如何协同工作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)