【发布时间】:2018-01-15 14:46:45
【问题描述】:
我对访问SQLiteDatabase 感到非常困惑。它应该是一个连接或多个连接才能从多个线程进行访问。我读过很多文章,包括以下两篇。
https://stackoverflow.com/a/3689883/3027124 http://touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking
这两个都建议使用单一连接。甚至我自己对同一问题的回答也被 OP 接受了。我使用Singleton 方法访问SQLiteopenHelper 类。
https://stackoverflow.com/a/35358702/3027124
但是在阅读了enableWriteAheadLogging的文档后我仍然感到困惑
此方法可以并行执行来自多个 同一数据库上的线程。它通过打开多个 连接到数据库并使用不同的数据库连接 对于每个查询。数据库日志模式也更改为启用 写入与读取同时进行。
现在这是令人困惑的部分。如果我想同时从多个线程访问数据库,我可以通过Singleton 访问SQLiteOpenHelper,这在我的理解中意味着插入的串行执行,而同时读取可以无错误地完成。但是上面的文档说,为了同时访问,应该调用enableWriteAheadLogging,这会返回创建多个连接。这是怎么回事??如果我通过在多个线程中使用Singleton SQLiteOpenHelper 调用getWritableDatabase() 来进行插入,这意味着什么?电话会是串行的吗?应该调用enableWriteAheadLogging 吗?
请澄清。
【问题讨论】:
-
您需要SQLiteDatabase#enableWriteAheadLogging 的用例是什么? “开始事务”或“sql-insert/update/delete”上的默认(无预写日志记录)阻止进一步读/写线程,直到事务执行完成,所以这应该是线程安全的。
标签: android multithreading sqlite android-sqlite sqliteopenhelper