SQLite 数据库中的并发性

Concurrency in SQLite database

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

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

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

这里是 link 关于 ContentProvider 的教程 http://www.vogella.com/articles/AndroidSQLite/article.html

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

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

"I want to read data from db on main thread": -> 请永远不要这样做。它会挂起你的 UI 直到数据库读取调用执行。始终在后台线程上执行。

据我了解,SQLite 本身会处理并发,因此我们无需担心。

您可以使用 Content Providerinsert() 方法来更新数据库。插入完成后,您可以使用 insert() 方法中的以下代码通知所有寄存器 Content Observer 有关数据库的更改:

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

用于创建、注册和注销ContentObserver。请点击here.

请从后台线程或AsyncQueryHandler调用所有与内容提供程序相关的操作。您可以了解更多 AsyncQueryHandler here.

如果需要更多详细信息或有帮助,请告诉我:)

要启用预写日志记录,只需调用 SQLiteOpenHelper 派生的 enableWriteAheadLogging() in the onConfigure() callback class。

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

Why GreenDao ?

  • Maximum performance (probably the fastest ORM for Android).
  • Easy to use APIs.
  • Highly optimized for Android.
  • Minimal memory consumption.
  • Small library size, focus on the essentials, code generator .

More info

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

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

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