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 Provider
的 insert()
方法来更新数据库。插入完成后,您可以使用 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 .
Realm 也正在使用 ORM 来替代 Sqlite,但在他们提供对 Content Provider 的支持之前我不会使用它!
除此之外,还有许多 RxJava 移植的 ORM 库可用,一旦您掌握了一些 RxJava 基础知识,请查看一下 (最难的事情,耗时,但它最大限度地减少了编码工作量)
我认为内容提供者+最小化SQLite ORM框架+RxJava支持将解决Android中的大部分ORM问题。
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 Provider
的 insert()
方法来更新数据库。插入完成后,您可以使用 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 .
Realm 也正在使用 ORM 来替代 Sqlite,但在他们提供对 Content Provider 的支持之前我不会使用它!
除此之外,还有许多 RxJava 移植的 ORM 库可用,一旦您掌握了一些 RxJava 基础知识,请查看一下 (最难的事情,耗时,但它最大限度地减少了编码工作量)
我认为内容提供者+最小化SQLite ORM框架+RxJava支持将解决Android中的大部分ORM问题。