SQlite:数据库被锁定错误

时间:2011-12-14 10:52:52

标签: android database sqlite locked

我正在为我的Android应用程序使用SOA架构。我在后台持续运行服务(每1分钟后)从我的MYSQL数据库获取数据并将其与我的SQLite数据库同步(如果2个数据库中有任何更改)。

现在,当服务在后台运行时,它会打开SQLite。同时,如果我正在处理(使用)应用程序,它还会尝试打开Sqlite来获取数据。在这种情况下,我收到一个名为的错误:数据库被锁定在android.database.SQLiteOpenHelper.getReadableDatabase。

有人可以建议我在这种情况下可以做些什么吗?

4 个答案:

答案 0 :(得分:2)

我希望你在这里使用ContentProvider

尽管它主要用于在应用程序之间共享,但它可以在我们的单个应用程序中使用。

如果我们使用内容提供程序,则无需担心关闭和锁定数据库。

参考Simple Content Provider for db operations

答案 1 :(得分:1)

您需要在应用和后台服务之间共享单个数据库连接。这将正确序列化对数据库的所有访问。

答案 2 :(得分:0)

SQlite是一个基于文件的数据库,一次只允许访问一个应用程序。

  1. 您必须将服务与应用程序同步,所以 该服务为应用程序提供了一些时间来获取新数据(有 这方面有很多解决方案;寻找信号量,监视器和循环)。

  2. 您使用第二个服务,它将从您的数据库获取对数据库的I / O请求 服务和应用程序,对它们进行排队,执行请求的I / O并返回任何结果 提交请求的应用程序或服务。

答案 3 :(得分:0)

事实并非如此,SQLite 3支持多个连接,您可以将它们保持打开状态。只需确保在更新线程中使用事务并尽快关闭它。

http://www.sqlite.org/lockingv3.html

中了解详情

如果你使用python,你可以使用例如在连接到db时设置timeout参数,这将确保阅读器线程在放弃之前等待超时秒。因此,使更新器尽可能紧凑是很重要的,这样读者就不会超时。

http://docs.python.org/library/sqlite3.html

另外,如果您想了解更多信息,我会深深推荐以下书籍。 SQLite权威指南:http://www.apress.com/9781590596739