如何在 SQLite 数据库中实现并发?根据文档,可以使用 WAL(预写日志记录)。但是,我不知道如何实现它。
在我的应用程序中,我想从主线程上的 db 读取数据,同时后台线程正在同一个表中写入/插入一些数据。在同时执行读写查询时,应用程序会停止响应,直到插入未完成。SQLite 中是否可以并发,以及如何实现?
如何在 SQLite 数据库中实现并发?根据文档,可以使用 WAL(预写日志记录)。但是,我不知道如何实现它。
在我的应用程序中,我想从主线程上的 db 读取数据,同时后台线程正在同一个表中写入/插入一些数据。在同时执行读写查询时,应用程序会停止响应,直到插入未完成。SQLite 中是否可以并发,以及如何实现?
要启用预写日志记录,只需在SQLiteOpenHelper 派生类的onConfigure() 回调中调用enableWriteAheadLogging() 。
您需要使用对象的单例DataBase
对象。为此,您可以使用ContentProvider
. 这是实现并发的更好选择。
这是ContentProvider
http://www.vogella.com/articles/AndroidSQLite/article.html上的教程链接
您也可以参考文档 http://developer.android.com/guide/topics/providers/content-providers.html
“我想在主线程上从 db 读取数据”:-> 请永远不要这样做。它将挂起您的 UI,直到执行数据库读取调用。始终在后台线程上执行此操作。
据我了解,SQLite 自己处理并发,所以我们不必担心它。
您可以使用Content Provider
它的insert()
方法来更新数据库。插入完成后,您可以Content Observer
通过在方法中使用以下代码通知所有注册有关数据库中的更改insert()
:
getContext().getContentResolver().notifyChange(uri, null);
用于创建、注册和注销ContentObserver
. 请点击这里。
请从后台线程或AsyncQueryHandler
. AsyncQueryHandler
你可以在这里了解更多。
让我知道是否需要更多详细信息或是否有帮助:)
我完全接受 Nigam Patro 的回答,参考我建议使用 Greenrobot 的GreenDAO和内容提供者,单例方法!
为什么选择绿道?
- 最高性能(可能是 Android 上最快的 ORM)。
- 易于使用的 API。
- 针对 Android 进行了高度优化。
- 最小的内存消耗。
- 库体积小,专注于要领,代码生成器。
Realm 也在趋势 ORM 以替代Sqlite ,但在他们提供对Content Provider的支持之前我不会使用它!
除此之外,还有许多 RxJava 移植的 ORM 库可用,一旦您掌握了一些 RxJava 基础知识(最困难的事情,耗时,但它最大限度地减少了编码工作),请查看一下
我认为内容提供者 + 最小化 SQLite ORM 框架 + RxJava 支持将解决 Android 中的大多数 ORM 问题。
在插入、更新或删除之前尝试SQLite 触发器写入日志