Android数据库文件损坏

Android数据库文件损坏,android,database,Android,Database,我有一个应用程序,允许用户将应用程序SQLite数据库文件保存到SD卡。这项功能已经实施了一年多,运行良好。我曾经让用户通过电子邮件向我发送他们的数据库文件,以防出现我无法重现的错误 最近,一个用户向我发送了他的数据库文件,当我试图将其加载到我的应用程序中(通过将其放置到应用程序的数据库文件位置)时,应用程序在尝试打开数据库文件时崩溃。该用户以前向我发送过他的文件,没有任何问题 我的应用程序过去和现在的唯一区别是:1)我添加了app-2-SD功能,2)我的应用程序现在的目标是2.2,而当时的目标

我有一个应用程序,允许用户将应用程序SQLite数据库文件保存到SD卡。这项功能已经实施了一年多,运行良好。我曾经让用户通过电子邮件向我发送他们的数据库文件,以防出现我无法重现的错误

最近,一个用户向我发送了他的数据库文件,当我试图将其加载到我的应用程序中(通过将其放置到应用程序的数据库文件位置)时,应用程序在尝试打开数据库文件时崩溃。该用户以前向我发送过他的文件,没有任何问题

我的应用程序过去和现在的唯一区别是:1)我添加了app-2-SD功能,2)我的应用程序现在的目标是2.2,而当时的目标是1.6(但在这两种情况下,1.5都是min SDK版本)

用户说他将应用程序放在SD卡上,然后应用程序开始崩溃。它甚至没有给他提交错误报告的选择权

当我将他的文件放在emulator中时,我得到了以下堆栈跟踪:

11-09 22:32:04.275: ERROR/AndroidRuntime(757): Caused by: android.database.sqlite.SQLiteException: file is encrypted or is not a database
11-09 22:32:04.275: ERROR/AndroidRuntime(757):     at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
11-09 22:32:04.275: ERROR/AndroidRuntime(757):     at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1636)
11-09 22:32:04.275: ERROR/AndroidRuntime(757):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1586)
11-09 22:32:04.275: ERROR/AndroidRuntime(757):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638)
11-09 22:32:04.275: ERROR/AndroidRuntime(757):     at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:168)
11-09 22:32:04.275:错误/AndroidRuntime(757):原因:android.database.sqlite.SQLiteException:文件已加密或不是数据库
11-09 22:32:04.275:ERROR/AndroidRuntime(757):位于android.database.sqlite.SQLiteDatabase.native_setLocale(native方法)
11-09 22:32:04.275:ERROR/AndroidRuntime(757):在android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1636)
11-09 22:32:04.275:ERROR/AndroidRuntime(757):位于android.database.sqlite.SQLiteDatabase.(SQLiteDatabase.java:1586)
11-09 22:32:04.275:ERROR/AndroidRuntime(757):位于android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:638)
11-09 22:32:04.275:ERROR/AndroidRuntime(757):位于android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:168)
他以前通过电子邮件向我发送过数据,而且这些文件的数据库名和扩展名都正确,所以我对他表示怀疑,并且不认为他发送了错误的文件。以前是否有人见过此问题,并且知道任何可能的原因和/或解决方案

更新 如果有什么不同,我从用户那里发现他的手机是HTC Evo 4G。我想我在最近的安卓版本中读到了一些关于加密数据库文件的信息,数据库文件存储在/data/secure/…下。。。而不是/data/data/。。。我想知道这是否有关联?无论如何,在进一步询问用户之后,我至少知道数据库文件中的一个特定表有问题。我的应用程序的不同部分与数据库文件中的不同表交互。该应用程序工作正常,允许他在访问其他表时保存/读取数据,但当他访问一个特定表时,仅尝试打开文件就会产生错误。我想我可以添加一个丑陋的修复程序,在异常发生时捕获它,然后删除损坏的表,然后重新创建它。想法?

我还有一个db(相当小)的应用程序,最近我收到了由于db问题而无法重现的崩溃报告

玩弄我的应用程序并真正推动它最终导致崩溃

在我的案例中,原因是由于
许多快速打开/关闭/更新请求、应用程序中断、应用程序期间的语言更改等,因此系统不知何故损坏了数据库。

我现在实现的解决方案是

a. close/reopen the db often to avoid problems 

b. have a consistency-check routine for every save or retrieve of data now - lots of overhead - but that cleared it fo me so far...
ps我没有得到和你一样的车祸报告。我现在有两款不同的安卓手机放在我的办公桌上进行测试,但几乎从未让它与最新的高端手机相撞。
与高速高端手机相比,内存更小/cpu速度较慢的手机似乎更容易出现这些问题。-但老实说,我仍然对此感到困惑。。。SD卡的使用可能也与此有关?

好的,你能用SQLite的任何工具检查这个文件吗,试着用SQLite工具打开这个数据库文件,看看里面的数据是否正确。这正是我尝试的第一件事。当我在SQLite中打开文件时,那里什么都没有。它没有显示我的表格,表格是如何构建的,等等。。。文件中没有任何内容,即使文件不是0字节。@Michael我也会遇到这样的问题。你找到解决办法了吗?我的问题是,我没有一个真实的答案。我认为问题与数据库在从一个活动转换到另一个活动时保持打开有关。我有一个活动,其中保存将在SQLite数据库上执行,我的意图是在保存完成后关闭数据库。但是,我发现了一个错误条件,允许进行保存,但阻止关闭数据库。然后,应用程序将跳转到另一个同样访问数据库的活动。在我修复该错误后,我没有出现任何腐败问题,但我无法确认这是原因。谢谢。每次需要访问时,我都会关闭/重新打开数据库,但没有进行一致性检查。我需要调查一下。你是如何设置支票的?围绕数据库open/save语句包装try-catch块,并在捕获异常时向用户发出问题警报?或者更深层的东西?我使用try-catch和一致性检查来确保没有无效数据。如果我碰巧找到了invaid数据,我会使用某些默认值来替换无效值。在我的情况下,这是可能的,我不必通知用户。他可能只是对一些存储的值丢失感到惊讶,但这是可以原谅的。顺便说一句,我必须在我的所有活动中复制相同的代码,以便他们能够在这些情况下轻松做出反应-但是,这可能不是最好的方法。。再次祝你好运,不幸的是,没有人真正知道这是否是解决办法