Jellybean中的Android SQLite数据库事务/锁定更改

时间:2013-04-26 22:53:01

标签: android sqlite android-sqlite

我有一个SQLite数据库,它在我的应用程序中得到了大量使用。可从以下网址访问:

  • 通过ASyncTasks(仅限select语句)将数据加载到UI中的各种活动
  • 多个后台进程(一次只能运行其中一个进程),执行许多插入/更新

我调用了一次getWritableDatabase()并在任何地方使用它。每个后台进程都使用IMMEDIATE(即非锁定)事务,这些事务将其中一些事件从几分钟加速到几秒钟。

这一切都完全适用于Jellybean之前;后台进程具有事务的速度优势,但这并没有阻止Activites通过ASyncTasks加载数据。

Post-Jellybean,当事务正在进行时,GUI的每个ASyncTask加载数据都被阻止,因此通常不会返回几秒钟。这使得导航变得缓慢且令人沮丧。我已经阻止了对rawQuery数据库调用的阻塞。

我无法找到任何文档,这些文档明确指出了Jellybean中已更改的内容,除了几个被弃用的方法 - http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#isDbLockedByOtherThreads() - 还有&#34之类的注释;不再有这样的概念数据库锁,因此此方法始终返回false。"

是否有一种模仿pre-Jellybean行为的简单方法?

2 个答案:

答案 0 :(得分:1)

似乎pre-Jelly Bean异步任务一直在并行运行。现在你已经有了一个Executor,它连续运行异步任务。好消息是,您可以通过基于操作系统版本的分支来指定任务的运行方式。

阅读this article

答案 1 :(得分:1)

我找到了解决自己问题的方法。 我仍然不确定谷歌在Jellybean中改变了什么来阻止现在工作之前的工作 - 但解决方法是使用enableWriteAheadLogging()

我之前尝试过这个,但无济于事 - 在交易正在进行时,我仍然被阻止读取。对我来说重要的是(在enableWriteAheadLogging()文档中)

  

如果数据库有任何附加数据库,则无法并行执行查询。

不幸的是,我的应用程序有两个独立的数据库连接在一起以允许连接查询--enableWriteAheadLogging()返回false。我有原型删除附件,这解决了阻塞问题;我的选择查询全部运行而没有延迟,而另一个线程运行IMMEDATE事务。

可悲的是,我将不得不重新设计我的数据库模式以实现完整修复。