核心数据存储损坏

seh*_*ugg 19 sqlite iphone core-data

我的iPhone应用程序的少数客户正在经历核心数据存储损坏(我假设是这样,因为错误是"无法保存到数据存储:操作无法完成.(可可错误259.)")

有没有其他人经历过这种商店腐败?我很担心,因为我的目标是很快推出执行模式迁移的更新,我担心这会暴露更多的问题.

我假设Core Data/SQLlite API使用原子操作并且不受损坏,除非底层文件系统遇到损坏.

有没有办法减少/防止腐败,以及重现腐败的方法,所以我可以测试这个(到目前为止我没有成功).

编辑:

还得到此错误:"/var/mobile/Applications//Documents/foo.sqlite中的数据库已损坏.SQLite错误代码11,数据库磁盘映像格式错误."

Mar*_*tin 20

它发生在我身上时,我手动改写我Base.sqlite没有删除Base.sqlite-walBase.sqlite-shm.实际上,这些文件是新的SQLite 3.7功能,可能在iOS 7中添加.

为了解决这个问题,我删除了Base.sqlite-*sqlite并从我的新基础版本重新生成它们.

  • 这有助于我在Core Data Migration期间解决问题,在迁移之后有-wal和-shm文件.发生这种情况时,我收到了损坏的数据库消息.由于数据库日志模式已设置为DELETE,因此这些文件确实不应该存在.叹.无论如何,确保在设置持久性存储之前删除它们.谢谢马丁. (4认同)

Tec*_*Zen 2

您收到的错误在 Foundation.h 中定义

NSFileReadCorruptFileError = 259, // 读取错误(文件损坏、格式错误等)

我从来没有在实际的商店中遇到过这种情况,但我也遇到过类似的问题,但权限不佳(在 Mac 上)。我也没有看到有人在网上提到类似的错误。Core Data 中的错误预防系统相当强大。

我猜想创建此文件的最简单方法是发送持久存储来查看错误的文件,例如意外地将其定位到文本文件。如果它需要 SQL 存储但发现其他内容,它会抱怨文件已损坏。这只是黑暗中的一枪。

编辑

这将很难追踪,因为这样的错误在核心数据中非常罕见,以至于没有任何工具可以帮助查找问题。

我会推荐:

  1. 检查上游代码的错误来源。也许有什么东西让这家商店与众不同,或者导致它去另一个地方。
  2. 检查任何可能做不标准事情的地方。例如,如果您在代码中生成自己的实体映射,那么如果您不小心,很容易将其丢失。