代码之家  ›  专栏  ›  技术社区  ›  Daniel Benedykt

Android-数据库磁盘映像格式不正确

  •  15
  • Daniel Benedykt  · 技术社区  · 14 年前

    出现此错误的原因是什么?

    没有关闭db?多线程访问数据库?或者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 回复  |  直到 13 年前
        1
  •  4
  •   Brad Hein    14 年前

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

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

    上面的JRL链接对于理解什么类型的事件会导致损坏的sqlitedb映像也非常有用。

    此外,SQLite本身在最近的历史中也进行了修补,以解决各种(罕见的)数据损坏情况。看到了吗 http://www.sqlite.org/changes.html . 因此,Android附带的SQLite版本并不是最新的,但随着Android的发展,与之捆绑的应用程序(如SQLite)也会随之发展。

    归根结底,作为程序员,我们只能做很多事情来防止SQLite损坏,所以有时将安全机制编码到我们的应用程序中是有利的,比如定期将DB备份到SDCard(我就是这么做的)。

        2
  •  3
  •   JRL    14 年前

    Here's a webpage 在SQLite网站上,列出了由于SQLite中的错误而导致的错误,下面是另一个标题为 How to corrupt your database

        3
  •  3
  •   AZ_    13 年前

    任何使用副作用删除作为删除或更新主题的同一表的其他行的删除或更新操作都可能导致数据库损坏。这一问题首先由2832号罚单确定。但是这个问题已经很老了,至少影响到SQLite的所有版本3.3.13(我们已经检查过的最早版本)

       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;
    

    在上面的示例中,更新的第一个周期会触发触发器并删除ex1表的第二行。当UPDATE循环的第二个周期运行时,它将尝试处理ex1表的第二行。SQLite意识到第二行已经被删除,所以它中止了第二个循环,但是它未能正确地清理它自己,这可能会导致错误 循环的后续循环。