2011-03-09 48 views
22

我有一个包含2个部分的应用程序。使用2个进程进行数据库处理

  • 创建内容的服务。
  • 使用内容

每个这些运行为不同的过程中的应用。问题是它们都共享一个数据库。而且,当服务尝试写入内容并且UI正在读取数据时,我经常会遇到数据库锁定错误。反之亦然。 这个怎么办?

  • 用于访问数据库的类是单例类。但由于这两个UI &服务是2个不同的进程,所以我假设有2个单例。所以这没有帮助。
  • 即使synchronise不会帮助我想,因为再次因为2个不同的过程。
  • Content Providers也许是一种选择,但由于我使用复杂的查询来挖掘信息,因此也很难使用它。

如何让两个进程共享数据库。 任何线索将不胜感激。

+0

可以指导我如何使用berkeley db。 – Kishore 2012-05-18 03:38:58

回答

7

使用内容提供者是一种选择。另一种是看看Berkeley DB。 BDB SQL API与SQLite兼容,BDB锁定管理器允许多个线程和/或进程同时读取/写入数据库。

+0

听起来很有趣。我一直在挖这方面的一些信息。有两个选项BDB和BDB SQL,我显然对后者感兴趣。但看起来我们需要构建源代码并刷新SQL版本的ROM? – Codevalley 2011-03-14 10:34:50

+0

OTN论坛是一个开始的好地方:http://bit.ly/eIREhr是的,我相信您需要构建源代码。我已请求某人在OTN论坛上跟进您的问题。 – dsegleau 2011-03-15 16:05:25

+0

这个链接也是一个很好的开始:http://bit.ly/hb7wlC – dsegleau 2011-03-15 16:10:27

3

关闭连接每个操作

抓数据库锁定错误后尝试之后50ms的

重新连接或让服务处理数据库和活动要求的服务,为数据

可能有isDatabaseInUseMethod?

+0

嗯,我的确知道没有'isDatabaseInUse'或类似的东西。由于服务和活动是不同的过程,它们之间的过程调用并不容易。 – Codevalley 2011-03-10 04:53:52

+3

是的,但你仍然可以捕捉异常并重复查询。围绕它做一个while语句,一旦其他进程关闭它的连接,它就会被执行。在两者中做同样的事情,他们将切换连接 – sherif 2011-03-10 09:21:32

+0

-1。这里有很多错误。这本质上是试图忽略像互斥体这样的东西被发明来解决的问题。不能保证一个流程会以任何合理的速度放行,例外情况应该是......例外,而不是规则,并且投票是一般应避免的事情。请做一些实际解决方案的研究。 – NargothBond 2017-12-19 23:45:54

1

您应该使用内容提供程序通过一个来源汇集数据库查询。在内容提供者的内部,你可以使用任何你想确保你没有并发访问的锁定机制。您也可以考虑使用内容观察器来协调服务操作和数据库更改。

+0

我确实在挖掘这些线条。无法在“ContentProviders”上获得一个示例应用程序。另外,我们可以在没有ContentObservers的情况下使用它吗? – Codevalley 2011-03-10 04:52:11

+0

是的,您可以在没有contentobservers的情况下使用它。观察者只是处理通知变化,但你必须手动触发它们,所以你可以忽略它们,如果你不想。 – 2011-03-10 17:01:33