2010-06-28 29 views
2

我在我的应用程序中有一个正常的SQLite数据库,通过我自己的ContentProvider管理并通过SQLiteOpenHelper实现。数据库每隔一段时间都会随机删除自己

仅在Droid上,每隔几周左右,数据库就会消失。我有几个用户为我写了这些内容,现在我也亲自看到了它。我添加了一些调试信息(每隔几周只能看到它时很难再现),并且在一个实例中,它仅发生在小部件更新之间 - 首先显示小部件并显示数据,下次SQLiteOpenHelper onCreate被调用。

该应用程序本身执行一些多线程恶意代码,但所有ContentProvider实现都具有synchronized关键字,所有对数据库的访问都是通过内容提供者进行的,并且在上述实例中,没有多线程正在进行应用程序本身没有运行,只是小部件)。

而且,这只是在Droid上。我从未在G1上看到过它。我从来没有关闭数据库,但它是一个内容提供商,听起来我不应该这样做(我记得hackbod说,这个想法是,操作系统将在必要时关闭应用程序的过程,这将自动关闭数据库)。

任何想法?

+0

这是多么容易重现?你有没有发生过任何logcat输出? – fadden 2010-06-28 20:39:09

+0

极难复制 - 它只是随机发生。我的应用有一个小部件,所以有一天我打开手机,看到小部件显示没有记录。 一些用户报告他们启动该应用程序,并且没有记录。由于我不知道什么时候发生,我没有logcat输出。我确实添加了一个日志文件到我的应用程序。我能看到的只是小部件更新,查询并获得结果。一小时后,小部件再次更新,执行查询,内容提供者试图抓取隐含地调用onCreate的数据库,指示没有数据库存在。 – EboMike 2010-06-28 22:13:52

+1

可能与http://b.android.com/5669(它还没有解析)相同。该错误有528条评论,迄今为止只有1条部分有用的错误报告,所以我希望你可以有办法让它发生或完整的日志。 – fadden 2010-06-29 20:51:40

回答

1

根据文档,SQLiteDatabase默认启用了锁定(SQLiteDatabase.setLockingEnabled)。在我的应用程序中,我在打开后明确地打开它,并添加了一些其他更偏执的同步,以确保多个线程不能同时访问数据库,并且似乎修复了它。

我仍然好奇为什么这个问题只发生在摩托罗拉Droid上,而且我预感到这款手机的锁定默认是禁用的,但这听起来有点奇怪 - 毕竟Droid是几乎没有制造商定制的手机之一。

在任何情况下,明确启用锁定和适当的同步对我来说都是诀窍。

相关问题