【发布时间】:2011-12-25 22:10:24
【问题描述】:
我有一个应用程序,允许用户将应用程序 SQLite 数据库文件保存到 SD 卡。该功能已经使用了一年多,并且运行良好。如果出现无法重现的错误,我曾让用户通过电子邮件将他们的数据库文件发送给我。
最近,一位用户向我发送了他的数据库文件,当我尝试将它们加载到我的应用程序中(通过将它们放入应用程序的数据库文件位置)时,应用程序在尝试打开数据库文件时崩溃了。该用户过去曾向我发送过他的文件,没有任何问题。
当时和现在我的应用程序之间的唯一区别是:1) 我添加了 app-2-SD 功能,2) 我的应用程序现在针对 2.2 而不是当时的 1.6(但 1.5 是两种情况下的最低 SDK 版本) .
用户说他将应用程序放在 SD 卡上,然后应用程序开始崩溃。它甚至没有给他提交错误报告的选项。
当我将他的文件放在模拟器中时,我得到了以下堆栈跟踪:
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)
他之前通过电子邮件将数据通过电子邮件发送给我,并且这些文件具有正确的数据库名称和扩展名,所以我给了他怀疑的好处,而不是假设他发送了一个不正确的文件。有没有人以前见过这个问题,并且知道任何可能的原因和/或解决方案?
更新 万一有什么不同,我从用户那里得知他的手机是 HTC Evo 4G。我想我在最近的 Android 版本中读到了一些关于加密数据库文件的东西,其中数据库文件存储在 /data/secure/... 而不是 /data/data/... 我想知道这是否相关?无论如何,在进一步询问用户之后,我至少知道这是数据库文件中的一个特定表有问题。我的应用程序的不同部分与数据库文件中的不同表交互。该应用程序运行良好,并允许他在访问其他表时保存/读取数据,但是当他访问一个特定表时,只是试图打开文件会产生错误。我想我可以添加一个丑陋的修复程序,如果它发生,它会捕获这个异常,然后删除损坏的表,然后重新创建它。想法?
【问题讨论】:
-
好的,你能用 SQLite 的任何工具检查这个文件吗,试着用 SQLite 工具打开这个数据库文件,看看你得到的数据是否正确。
-
这正是我尝试的第一件事。当我在 SQLite 中打开文件时,那里什么也没有。它没有显示我的表格,表格的构造方式等......文件中没有任何内容,即使文件不是 0 字节。
-
@Michael 我也遇到了这样的问题。你找到解决方案了吗?我的问题是stackoverflow.com/questions/10210503/…。
-
我没有真正的答案。我认为问题与从一个活动转换到另一个活动时数据库保持打开状态有关。我有一个活动将在 SQLite 数据库上执行保存,我的意图是在保存完成后关闭数据库。但是,我发现了一个允许进行保存但阻止数据库关闭的错误情况。然后应用程序会跳转到另一个也访问数据库的 Activity。修复该错误后,我没有再遇到任何损坏问题,但我无法确认这是原因。