代码之家  ›  专栏  ›  技术社区  ›  cpjolicoeur

iPhone SDK上的sqlite数据库磁盘映像格式不正确

  •  8
  • cpjolicoeur  · 技术社区  · 14 年前

    我对iPhone SDK上使用sqlite作为数据库后端的新应用程序有问题。

    有时,我的应用程序会停止将数据加载到我的UITableView,在通过Organizer下载设备数据库之后,我可以通过命令行访问sqlite数据库。我可以查询某些表,但不能查询其他表,而不会得到“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数据库。我通过后台线程中的nsOperationQueue从Web服务器下载数据,并使用下载的数据更新sqlite db。在后台线程中写入数据库(同时可能从主线程中读取)会损坏数据库,还是会导致其他问题?

    3 回复  |  直到 8 年前
        1
  •  5
  •   software evolved    14 年前

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

    如果在断点处暂停,并单击停止登录xcode,则应用程序立即退出。这通常会导致错误,如您看到的错误或“损坏的数据库”错误。

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

        2
  •  5
  •   Community CDub    8 年前

    在我的例子中,这与iOS 7有关:在iOS 7上,核心数据现在使用sqlite-wal日志模式,该模式将数据写入 .db-wal 文件而不是直接指向 .db 文件。在我的应用程序中,我会复制一个 数据库 归档为 Library/Application Support 在应用程序更新期间。问题是 DB WAL 文件仍在那个目录中,我只替换了 数据库 文件。这样,我最终得到了 数据库 与旧文件不同步的文件 DB WAL 文件。

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

    1. 确定 数据库 , DB WAL .db-shm 在复制新文件之前,文件将被删除 数据库 归档。
    2. 回到旧的iOS 7之前的行为,比如: https://stackoverflow.com/a/18870738/171933
        3
  •  0
  •   makdad    14 年前

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

    对于我们的应用程序,我们必须滚动我们自己的sqlite来添加全文搜索。看一看 this page .

    推荐文章