Android - 数据库磁盘映像格式错误

时间:2010-06-02 17:26:13

标签: database android

在我的Android应用程序中,我收到“数据库磁盘映像格式错误” 出现此错误的原因是什么?

没关闭数据库?多个线程访问数据库?或者android刚刚被破坏了?

由于

android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed
   android.database.sqlite.SQLiteQuery.native_fill_window(Native Method)
   android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:75)
   android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:288)
   android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:269)
   android.database.AbstractCursor.moveToPosition(AbstractCursor.java:171)
   android.database.AbstractCursor.moveToFirst(AbstractCursor.java:248)
...

3 个答案:

答案 0 :(得分:4)

我遇到过许多在Android上报告sqlite损坏问题的人。大多数情况下,它与任务杀手有关,但仍有一小部分人仍然遇到随机的SQLite损坏。

例如,这个问题: http://code.google.com/p/android/issues/detail?id=4866

上面的JRL链接对于了解哪些类型的事件可能导致SQLite DB映像损坏非常有用。

此外,SQLite本身在最近的历史中已被修补,以解决各种(罕见)数据损坏情况。见http://www.sqlite.org/changes.html。所以Android附带的SQLite版本并不是最新版本,但随着Android的发展,与它捆绑在一起的应用程序也是如此,例如SQLite。

在一天结束时,我们只能做程序员以防止SQLite损坏,所以它有时有利于在我们的应用程序中编写安全机制,例如定期将数据库备份到SDCard(这就是我的工作)。

答案 1 :(得分:3)

错误从本机代码传递到Java,因此您必须查看SQLite损坏的可能原因。 SQLite网站上的Here's a webpage列出了由于SQLite中的错误而导致的错误,此处的另一个标题为How to corrupt your database

答案 2 :(得分:3)

已在版本3.5.4(2007-12-14)中修复: 任何使用副作用删除作为DELETE或UPDATE主题的同一表的其他行的DELETE或UPDATE操作都可能导致数据库损坏。该问题首先由机票#2832确定。但问题非常严重,影响所有版本的SQLite,至少回溯到版本3.3.13(我们已经检查过的最早版本。)

上一段中的“删除副作用”表示由于OR R​​EPLACE子句或触发器而发生的删除。例如:

   CREATE TABLE ex1(a INTEGER PRIMARY KEY, b);
   INSERT INTO ex1 VALUES(1,2);
   INSERT INTO ex1 VALUES(2,3);
   CREATE TRIGGER ex1_tr1 AFTER UPDATE ON ex1 BEGIN
     DELETE FROM ex1 WHERE a=old.b;
   END;
   UPDATE ex1 SET b=b+1;

在上面的示例中,UPDATE的第一个循环导致触发器触发并删除ex1表的第二行。当UPDATE循环的第二个循环运行时,它会尝试处理ex1表的第二行。 SQLite认识到第二行已被删除,因此它会中止第二个循环,但它无法正常清理,这可能会在循环的后续循环中导致数据库损坏