具有多线程的Android sqlite

标签 android multithreading sqlite android-loadermanager

我正在使用 sqlite 编写一个 android 应用程序。有许多 Activity 和一项服务。我使用来自多个线程的数据库。它在 Android 2.X 中完美运行,但是一旦我在 Android 3.X 中运行它,它总是抛出此错误并强制关闭:

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)

有谁知道为什么会这样以及如何解决?

我在互联网上进行了研究,大多数人建议:

  1. 仅为应用程序使用一个数据库连接。如何保证?我想为服务和 Activity 共享数据库连接。我应该通过创建一个公共(public)静态数据库变量来实现吗?
  2. 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

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

关于具有多线程的Android sqlite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10450977/

相关文章:

sqlite - 如果 SQLite 中不存在,则更改表添加列

sqlite - 为什么这个触发器不阻止在 sqlite 中插入行?

android - 如何禁用 fragment 区域中的触摸

java - 通过手动触发内存屏障来避免并发结构

ios - 如何将sqlite文件导入ios中app的文档目录?

c# - 如何等到 File.Exists?

c++ - boost::thread 和 std::thread 兼容性问题?

android - 使用不同版本的 Android 设备进行扫描时,为同一 BLE 设备获取不同的 byte[] scanRecord 数据

java - 无法在 Android 中使用 Selenium 依赖项(在纯 Java 中工作)

android - LocationListener 适用于模拟器,不适用于手机