首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何避免SQLiteException锁定错误

如何避免SQLiteException锁定错误
EN

Stack Overflow用户
提问于 2010-03-08 05:02:48
回答 4查看 12.2K关注 0票数 16

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

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

我知道SQLite会在插入/更新时锁定整个数据库,但这些错误似乎只有在我运行select查询时插入/更新时才会发生。select查询返回一个游标,当我遍历它时,它被打开了很长时间(有时是几秒钟)。如果select查询没有运行,我永远不会获得锁。我很惊讶select可以锁定数据库。这是可能的吗,还是发生了其他事情?

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

EN

回答 4

Stack Overflow用户

发布于 2012-02-15 20:18:48

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

与jcwenger的答案一样,使用ContentProvider是实现这一目标的另一种方式,但需要对代码进行更多侵入性更改。

票数 7
EN

Stack Overflow用户

发布于 2010-03-08 16:22:04

避免让游标在“相当长的一段时间内”打开。如果你有能力将所有的数据一次性存储在内存中,那么就这么做吧。

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

票数 2
EN

Stack Overflow用户

发布于 2011-02-26 04:44:35

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

ContentResolver的api开销很小。您只需要定义一个权威字符串(标识数据“种类”的惟一字符串--使用"com.example.myapp.contacts“类型的字符串)并使用ContentResolver.bla而不是db.bla。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2397959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档