1

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

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

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

在 Jellybean 之前,这一切都非常有效。后台进程具有事务的速度优势,但这并没有阻止 Activites 通过 ASyncTasks 加载数据。

在 Jellybean 之后,每个用于 GUI 的 ASyncTask 加载数据在事务进行时都会被阻止,因此通常几秒钟内都不会返回。这使得导航缓慢而令人沮丧。我已将阻塞隔离到 rawQuery 数据库调用。

除了不推荐使用的几种方法 - http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#isDbLockedByOtherThreads() - 带有注释外,我找不到任何文档可以准确指定 Jellybean 中发生的变化比如“不再有数据库锁的概念,所以这个方法总是返回false”。

有没有一种简单的方法来模仿前果冻豆的行为?

4

2 回答 2

1

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

阅读这篇文章

于 2013-04-26T23:55:36.827 回答
1

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

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

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

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

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

于 2013-04-29T13:15:25.650 回答