如何检查锁定状态并在必要时解锁Blackberry上的数据库?

时间:2012-03-29 15:28:57

标签: blackberry sqlite

自从我开始开发我的Blackberry应用程序以来,我遇到的最大问题都与SQLite数据库有关。

现在我正在通过压力测试我的应用程序,当问题弹出时,我通过打印状态到控制台并逐行处理事情来解决它们。现在(在我的应用程序上粘贴按钮后)我收到“数据库被锁定”错误,我不知道该怎么做。

似乎一旦数据库被锁定,它就会被锁定,直到它被解锁........我的问题是如何解锁它?首先,我如何检查它是否被锁定?

我确信我们的用户不会像我一样捣碎按钮,但你永远不会知道。我想说明每种可能的情况。

由于

编辑:这就是我的应用程序中发生的事情.....当我启动它时启动一个线程,这个线程根据某些数据块的大小来执行我的一个表的清理(使用DELETE )。然后,线程继续从我的DB(只读)获取USER对象,然后使用此USER对象作为参数来调用Web服务。从Web服务检索的数据被INSERTED到我的数据库中。 (它稍微复杂一些,因为此时会执行一些读/写操作。之后,线程会触发一个回调方法来更新我的UI。

一切正常。我可以退出应用程序,当线程正在运行并重新启动时,一个标志将阻止它启动同一个线程的新实例(除非另一个当然完成)。

现在我的问题:我的应用程序的主屏幕是一个按钮列表,当用户单击其中一个按钮时,会加载更详细的列表(这需要对数据库进行READ ONLY调用)。当我启动应用程序(触发Web服务调用线程)然后立即单击主屏幕上的按钮时,表将被锁定。 (并非总是如此,有时需要4或5次尝试,有时更多,有时更少)。但是,如果我继续这样做,它最终将锁定使得无法对我的数据库进行任何调用,因此不再需要UI(这取决于数据库)。

在第二个屏幕上填充UI的数据库调用是READ ONLY,我不能拥有尽可能多的这些吗?导致数据库锁定的原因是什么? DB锁定和文件系统错误(12)

之间的区别是什么

3 个答案:

答案 0 :(得分:4)

我似乎解决了这个问题。我的印象是,如果读/写连接打开,则可以安全地创建只读连接。

似乎并非如此。如果我打开了一个读/写连接,那么在完成之前不能打开任何其他连接。

我基本上创建了一个读/写连接,设置了一个标志以将其标识为打开,并且在我的读连接期间,如果标志打开则使用相同的Database对象,或者如果它已关闭则创建只读。

到目前为止一切顺利。

答案 1 :(得分:3)

Sqlite不支持并发修改。在BlackBerry上的实践中,这意味着您一次只能从代码的一部分打开数据库。为了保持这种一次一个访问,你需要在完成后关闭数据库,正如@AnkitRox指出的那样。

但是,您还需要防范并发访问。即使您的代码正确关闭了数据库,也有两个不同的线程可以访问数据库。在这种情况下,你需要一个等待。在Java-ME中,这通常通过'synchronized'关键字完成,并使用相同的锁对象进行所有数据库访问。

答案 2 :(得分:1)

正确检查,分别在执行查询之前和之后打开和关闭数据库。

因为如果数据库打开而没有正确关闭它,那么就会出错。