如何避免SQLiteException锁定错误

The*_*One 16 sqlite android locking

我正在开发一个Android应用程序.它有多个线程读取和写入Android SQLite数据库.我收到以下错误:

SQLiteException:错误代码5:数据库已锁定

我理解SQLite会在插入/更新时锁定整个数据库,但在我运行select查询时插入/更新时似乎只会发生这些错误.select迭代返回一个游标,当我迭代它时,它会被打开很多(几次几秒).如果select查询没有运行,我永远不会得到锁.我很惊讶select可以锁定数据库.这是可能的,还是还有其他事情发生?

什么是避免这种锁定的最佳方法?

Gra*_*and 7

您可能在各种线程中打开和关闭多个数据库连接.这是一个坏主意.只需打开一个数据库连接,并在任何地方重用它; 然后,SQLite将确保正确序列化并发访问.

与jcwenger的答案一样,使用ContentProvider是实现此目的的另一种方法,但需要对代码进行更多的干扰性更改.


dan*_*n04 2

通过避免让光标打开“相当长一段时间”。如果您有能力将所有数据一次性保存在内存中,那么就这样做。

如果不能,请尝试增加繁忙超时。