我正在开发一个Android应用程序。它有多个线程读取和写入Android SQLite数据库。我收到以下错误:
SQLiteException:错误代码5:数据库已锁定
我理解SQLite会在插入/更新时锁定整个数据库,但这些错误似乎只在我运行select查询时插入/更新时发生。 select迭代返回一个游标,当我迭代它时,它会被打开很多(几次几秒)。如果select查询没有运行,我永远不会得到锁。我很惊讶select可以锁定数据库。这是可能的,还是还有其他事情发生?
避免这种锁定的最佳方法是什么?
答案 0 :(得分:7)
您可能在各种线程中打开和关闭多个数据库连接。这是一个坏主意。只需打开一个数据库连接,并在任何地方重用它;然后,SQLite将确保正确序列化并发访问。
与jcwenger的回答一样,使用ContentProvider是另一种实现此目的的方法,但需要对代码进行更多的干扰性更改。
答案 1 :(得分:2)
避免将游标打开“相当长一段时间”。如果您能够一次性将所有数据都存储在内存中,那么就这样做。
如果不能,请尝试增加忙碌时间。
答案 2 :(得分:1)
迁移到ContentProvider而不是直接访问数据库。 ContentResolver为您解决所有线程问题,并允许其他有用的功能,如在应用程序之间共享数据或与服务器同步。
ContentResolver的api开销很小。您只需要定义一个AUTHORITY字符串(标识数据“种类”的唯一字符串 - 使用“com.example.myapp.contacts”类型的字符串)并使用ContentResolver.bla而不是db.bla。
答案 3 :(得分:0)
它由beginTransaction()函数引起。看看你的代码,问题解决了我的应用程序发表评论行这个函数(beginTransaction)行