2

如何在 SQLite 数据库中实现并发?根据文档,可以使用 WAL(预写日志记录)。但是,我不知道如何实现它。

在我的应用程序中,我想从主线程上的 db 读取数据,同时后台线程正在同一个表中写入/插入一些数据。在同时执行读写查询时,应用程序会停止响应,直到插入未完成。SQLite 中是否可以并发,以及如何实现?

4

5 回答 5

2

要启用预写日志记录,只需在SQLiteOpenHelper 派生类的onConfigure() 回调中调用enableWriteAheadLogging() 。

于 2015-12-22T12:41:05.513 回答
0

您需要使用对象的单例DataBase对象。为此,您可以使用ContentProvider. 这是实现并发的更好选择。

这是ContentProvider http://www.vogella.com/articles/AndroidSQLite/article.html上的教程链接

您也可以参考文档 http://developer.android.com/guide/topics/providers/content-providers.html

于 2015-12-22T06:16:20.163 回答
0

“我想在主线程上从 db 读取数据”:-> 请永远不要这样做。它将挂起您的 UI,直到执行数据库读取调用。始终在后台线程上执行此操作。

据我了解,SQLite 自己处理并发,所以我们不必担心它。

您可以使用Content Provider它的insert()方法来更新数据库。插入完成后,您可以Content Observer通过在方法中使用以下代码通知所有注册有关数据库中的更改insert()

getContext().getContentResolver().notifyChange(uri, null);

用于创建、注册和注销ContentObserver. 请点击这里

请从后台线程或AsyncQueryHandler. AsyncQueryHandler 你可以在这里了解更多。

让我知道是否需要更多详细信息或是否有帮助:)

于 2015-12-22T07:24:16.200 回答
0

我完全接受 Nigam Patro 的回答,参考我建议使用 Greenrobot 的GreenDAO和内容提供者,单例方法!

为什么选择绿道?

  • 最高性能(可能是 Android 上最快的 ORM)。
  • 易于使用的 API。
  • 针对 Android 进行了高度优化。
  • 最小的内存消耗。
  • 库体积小,专注于要领,代码生成器。

更多信息

Realm 也在趋势 ORM 以替代Sqlite ,但在他们提供对Content Provider的支持之前我不会使用它!

除此之外,还有许多 RxJava 移植的 ORM 库可用,一旦您掌握了一些 RxJava 基础知识(最困难的事情,耗时,但它最大限度地减少了编码工作),请查看一下

我认为内容提供者 + 最小化 SQLite ORM 框架 + RxJava 支持将解决 Android 中的大多数 ORM 问题。

于 2015-12-24T06:13:48.230 回答
-1

在插入、更新或删除之前尝试SQLite 触发器写入日志

于 2015-12-22T06:42:42.827 回答