【问题标题】:Android Database file corruptionAndroid 数据库文件损坏
【发布时间】: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。修复该错误后,我没有再遇到任何损坏问题,但我无法确认这是原因。

标签: android database


【解决方案1】:

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

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

我的原因是many fast opening/closing/update requests, interruption of the app, language changes during the app, etc so the system somehow corrupted the 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 我没有得到和你一样的崩溃报告。我现在有几部不同的 Android 手机在我的办公桌上进行测试,而且几乎从来没有让它与最新的高端手机崩溃。 这些问题似乎在内存较小/速度较慢的 cpu 手机上比快速的高端手机更常见。 - 但老实说,我仍然对此感到困惑! ... 可能 SD 卡的使用也与此有关?

【讨论】:

  • 谢谢。每次我需要访问时,我都会关闭/重新打开数据库,但我没有进行一致性检查。我需要调查一下。你是如何设置支票的?类似于在数据库打开/保存语句周围包装 try-catch 块,并在捕获异常时提醒用户问题?或者更深层次的东西?
  • 我使用 try-catch 和一致性检查来确保没有无效数据。如果我碰巧发现无效数据,我会使用某些默认值来替换无效值。就我而言,这是可能的,我不必通知用户。他可能只是对丢失一些存储值感到惊讶——但这是可以原谅的。顺便说一句,我必须在我的所有活动中为此复制相同的代码,以便他们可以在这些情况下轻松做出反应 - 但是,这可能不是最好的方法。祝你好运 - 再次 - 没有人真正知道这是否是解决方案,不幸的是
猜你喜欢
  • 1970-01-01
  • 2018-11-21
  • 1970-01-01
  • 2011-11-22
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2014-03-17
  • 1970-01-01
相关资源
最近更新 更多