我正在开发一个Android应用程序。它有多个线程对Android SQLite数据库进行读写。我收到以下错误:
SQLiteException:错误代码5:数据库已锁定
我知道SQLite会在插入/更新时锁定整个数据库,但这些错误似乎只有在我运行select查询时插入/更新时才会发生。select查询返回一个游标,当我遍历它时,它被打开了很长时间(有时是几秒钟)。如果select查询没有运行,我永远不会获得锁。我很惊讶select可以锁定数据库。这是可能的吗,还是发生了其他事情?
避免这种锁的最好方法是什么?
发布于 2012-02-15 20:18:48
您可能正在打开和关闭各个线程中的多个数据库连接。这不是个好主意。只需打开一个数据库连接,并在任何地方重用它;然后,SQLite将确保并发访问被正确序列化。
与jcwenger的答案一样,使用ContentProvider是实现这一目标的另一种方式,但需要对代码进行更多侵入性更改。
发布于 2010-03-08 16:22:04
避免让游标在“相当长的一段时间内”打开。如果你有能力将所有的数据一次性存储在内存中,那么就这么做吧。
如果不能,请尝试增加繁忙超时。
发布于 2011-02-26 04:44:35
迁移到ContentProvider,而不是直接访问数据库。ContentResolver为你封送了所有的线程问题,还允许其他有用的功能,比如在应用程序之间共享数据或与服务器同步。
ContentResolver的api开销很小。您只需要定义一个权威字符串(标识数据“种类”的惟一字符串--使用"com.example.myapp.contacts“类型的字符串)并使用ContentResolver.bla而不是db.bla。
https://stackoverflow.com/questions/2397959
复制相似问题