微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Android sqlite多线程

我正在使用sqlite编写一个android应用程序.有许多活动和一项服务.我使用来自多个线程的数据库.它在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)

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

我在网上研究过,大多数人都建议:

>仅为应用程序使用一个DB连接.怎么保证呢?我想分享服务和活动的数据库连接.我应该通过创建一个公共静态DB变量来做到这一点吗?
> 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如何协同工作.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐