2013-04-26 62 views
1

我有一个SQLite数据库,它在我的应用程序中收到了一些重要的用处。它是从访问:Jellybean中的Android SQLite数据库事务/锁定更改

  • 各种活动,经由ASyncTasks将数据加载到所述UI(SELECT语句只)
  • 几个后台进程(仅其中之一可以一次运行),其做很多插入/更新

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

这一切都工作完美前jellybean;后台进程具有事务的速度优势,但这并未阻止Activites通过ASyncTasks加载数据。

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

我无法找到指定确切的任何文档什么杰利贝恩改变,不是被弃用的几种方法等 - http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#isDbLockedByOtherThreads() - 与像评论“不再有数据库锁的概念,所以此方法始终返回false “。

有没有简单的方法来模仿前软糖豆的行为?

回答

1

我已经找到了解决我自己的问题。 我仍然不确定谷歌已经改变了什么软糖,以阻止现在工作之前的工作 - 但解决方案是使用enableWriteAheadLogging()

我以前试过这个,无济于事 - 在交易正在进行时,我仍然遇到封锁读取。对我来说重要的是(在enableWriteAheadLogging()文档中)

如果数据库有任何附加的数据库,那么并行执行查询是不可能的。

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

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

1

看起来,预果冻豆异步任务并行运行。现在你已经有一个Executor在封面下连续运行异步任务。好消息是,您可以通过基于操作系统版本的分支来指定您的任务如何运行。

阅读this article

+0

谢谢,但我已经在使用ICS及更高版本的AsyncTask.THREAD_POOL_EXECUTOR。在这种情况下,记录将rawQuery调用隔离为阻塞程序。 – pennas 2013-04-27 09:32:19