【问题标题】:sqlite database disk image malformed on iPhone SDKiPhone SDK 上的 sqlite 数据库磁盘映像格式错误
【发布时间】:2011-04-25 11:31:17
【问题描述】:

我在 iPhone SDK 上使用 SQLite 作为数据库后端的新应用程序遇到问题。

有时,我的应用程序会停止向我的 UITableViews 加载数据,通过 Organizer 下载设备 DB 后,我可以通过命令行访问 SQLite DB。我可以很好地查询某些表,但不能查询其他表,而不会出现“SQL 错误:数据库磁盘映像格式错误”错误。请参阅下面的 sqlite 会话:

    SQLite version 3.6.17
    Enter ".help" for instructions
    Enter SQL statements terminated with a ";"
    sqlite> select * from user;
    1|cpjolicoeur@gmail.com|cpjolicoeur||4d055e38bb1d3758|image/gif|cartoonme_avatar.gif||Craig|Jolicoeur|1|1
    sqlite> select * from item;
    SQL error: database disk image is malformed
    sqlite> 

在此示例中,我的用户表工作正常,但我的项目表格式错误,这与我在应用程序中看到的项目未加载的情况相对应。应用程序不会崩溃,只是因为这个格式错误的错误而无法加载数据。

任何想法为什么会发生这种情况?我唯一的想法是数据库可能已损坏,因为我正在通过应用程序中的后台线程写入 SQLite DB。我通过后台线程中的 NSOperationQueue 从网络服务器下载数据,并使用下载的数据更新 SQLite DB。在后台线程中写入数据库(同时可能从主线程读取)会破坏数据库,还是其他原因?

【问题讨论】:

    标签: iphone database sqlite


    【解决方案1】:

    在调试时你必须非常小心后台线程访问数据库!这是因为当调试器停止处理(例如在断点处)时,所有线程都会暂停,包括可能处于数据库调用中间、数据库“打开”和数据库“关闭”调用之间的线程。

    如果您在断点处停止,并在 Xcode 中单击停止符号,您的应用程序将立即退出。这通常会导致错误,例如您看到的错误,或“损坏的数据库”错误。

    确实没有任何解决方案(因为没有办法修改“停止任务”的行为,但我已经发展了一些技术来缓解它: 1. 添加代码以检测应用程序进入后台并让您的数据库操作正常停止。 2. 调试时切勿使用停止符号来停止处理。相反,当完成断点然后“继续”时,点击模拟器或设备上的主页按钮(这应该会触发您在步骤 1 中添加的代码),等待应用程序进入后台,然后您可以停止运行。

    【讨论】:

      【解决方案2】:

      在我的情况下,这与 iOS 7 有关:在 iOS 7 上,Core Data 现在使用 SQLite WAL 日志模式,该模式将数据写入.db-wal 文件,而不是直接写入.db 文件。在我的应用程序中,我会在应用程序更新期间将准备好的.db 文件复制到Library/Application Support。问题是旧的.db-wal 文件仍在该目录中,我只替换了.db 文件。这样,我最终得到了一个与旧的 .db-wal 文件不同步的 .db 文件。

      这个问题有两种解决方案:

      1. 在将新的 .db 文件复制到位之前,请确保删除了 .db.db-wal.db-shm 文件。
      2. 回到 iOS 7 之前的旧行为,如下所示:https://stackoverflow.com/a/18870738/171933

      【讨论】:

      • 删除 wal 和 shm 文件完全帮了我的忙!谢谢
      【解决方案3】:

      取决于 SQLite 的编译方式,它可能是线程安全的,也可能不是线程安全的。如果您使用的是内置的,它可能没有您正在寻找的编译时选项。

      对于我们的应用,我们必须推出自己的 SQLite 来添加全文搜索。看看this page

      【讨论】:

        猜你喜欢
        • 2014-05-02
        • 2023-03-26
        • 2014-11-16
        • 1970-01-01
        • 2015-02-11
        • 1970-01-01
        • 1970-01-01
        • 2011-07-13
        相关资源
        最近更新 更多