我有一个SQLite数据库,它在我的应用程序中得到了大量使用。可从以下网址访问:
我调用了一次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行为的简单方法?
答案 0 :(得分:1)
似乎pre-Jelly Bean异步任务一直在并行运行。现在你已经有了一个Executor,它连续运行异步任务。好消息是,您可以通过基于操作系统版本的分支来指定任务的运行方式。
答案 1 :(得分:1)
我找到了解决自己问题的方法。 我仍然不确定谷歌在Jellybean中改变了什么来阻止现在工作之前的工作 - 但解决方法是使用enableWriteAheadLogging()。
我之前尝试过这个,但无济于事 - 在交易正在进行时,我仍然被阻止读取。对我来说重要的是(在enableWriteAheadLogging()文档中)
如果数据库有任何附加数据库,则无法并行执行查询。
不幸的是,我的应用程序有两个独立的数据库连接在一起以允许连接查询--enableWriteAheadLogging()返回false。我有原型删除附件,这解决了阻塞问题;我的选择查询全部运行而没有延迟,而另一个线程运行IMMEDATE事务。
可悲的是,我将不得不重新设计我的数据库模式以实现完整修复。