如何避免SQLiteExceptionlocking错误

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

SQLiteException:错误代码5:数据库被locking

我知道SQLitelocking插入/更新整个数据库,但这些错误只有插入/更新时,我正在运行select查询时发生。 select查询返回一个游标,当我迭代它的时候,这个游标被打开的时间相当长(几秒钟)。 如果select查询没有运行,我永远不会得到锁。 我很惊讶,select可以locking数据库。 这是可能的,还是其他的事情呢?

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

Solutions Collecting From Web of "如何避免SQLiteExceptionlocking错误"

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

就像jcwenger的回答一样,使用ContentProvider是实现这一目的的另一种方式,但是需要对代码进行更多干扰性的更改。

通过避免将游标留在“相当长一段时间”。 如果你可以负担得起所有的数据在内存中,那么这样做。

如果你不能,那么尝试增加忙时间。

迁移到ContentProvider而不是直接访问数据库。 ContentResolver为您排除了所有线程问题,还允许其他有用的function,如在应用程序之间共享数据或与服务器同步。

ContentResolver的api开销很小。 你只需要定义一个AUTHORITYstring(一个唯一的string标识你的数据的“种类” – 使用“com.example.myapp.contacts”types的string),并使用ContentResolver.bla而不是db.bla。

它是由beginTransaction()函数引起的。查看你的代码,问题解决了我的应用程序做了一个注释行这个函数(beginTransaction)行