1

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

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

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

4

4 回答 4

2

我更喜欢你在这里使用ContentProvider

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

如果我们使用内容提供者,就不用担心数据库的关闭和锁定。

请参阅简单内容提供程序以进行数据库操作

于 2011-12-14T11:05:25.437 回答
1

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

于 2011-12-14T10:54:34.597 回答
0

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

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

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

于 2011-12-14T10:58:39.540 回答
0

这不是真的,SQLite 3 支持多个连接,你可以让它们都打开。只要确保在更新线程中使用事务并尽快关闭它。

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

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

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

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

于 2011-12-14T11:07:43.573 回答