2015-12-22 46 views
2

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

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

+0

当您打开数据库并获取SQLite Db的实例时,您需要启用WLA我猜测http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html方法:enableWriteAheadLogging – virendrao

+0

“我想读取数据从主线程上的数据库“: - >请不要这样做。在后台线程中从数据库读取数据并从主线程更新您的UI。 –

+0

@virendrao我已经改变了这一点。我正在使用SQLChipher库,并没有像enableWriteAheadLogging这样的方法。 Thnaks。 –

回答

0

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

这里是ContentProvider http://www.vogella.com/articles/AndroidSQLite/article.html

链接教程你可以参考的文档也 http://developer.android.com/guide/topics/providers/content-providers.html

+0

是的,它可以通过ContentProvider实现,但是,正如我提到的那样,如何使用WAL? –

+0

@PorasBhardwaj来实现,我也不知道如何实现WAL。 –

0

“我想读数据从主线程数据库“: - >请不要这样做。它会挂起你的用户界面直到执行数据库读取调用。总是在后台线程上做。

按照我的理解,SQLite处理并发本身,所以我们不需要担心它。

您可以使用Content Provider通过使用它的insert()方法更新数据库。一旦插入完成,你可以通知所有使用下面的代码在insert()方法注册Content Observer有关数据库的变化:

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

创建,注册和注销ContentObserver。请点击here

请通过后台线程或AsyncQueryHandler致电所有Content Provider相关操作。你可以知道更多关于AsyncQueryHandlerhere

让我知道更多的细节需要或是否有帮助:)

0

我完全接受Nigam Patro的回答,提到我推荐使用Greenrobot的GreenDAO与内容提供商,Singleton方法!

为什么选择GreenDao?

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

More info

境界也趋向ORM与替代sqlite的,但直到他们为Content Provider提供支持,我不使用它!

除此之外还有很多RxJava移植提供ORM库看看到,一旦你掌握一些RxJava基础(最艰难的事情,费时费力,但它最大限度地减少了编码工作)

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