iOS 7 中的 CoreData 迁移

Posted

技术标签:

【中文标题】iOS 7 中的 CoreData 迁移【英文标题】:CoreData migration in iOS 7 【发布时间】:2014-05-04 19:31:24 【问题描述】:

终于让这个迁移工作了,真是太痛苦了。

source code

ios6 中一切正常,但在 iOS7 应用程序崩溃

【问题讨论】:

崩溃并出现什么错误消息和/或症状,以及迁移过程的哪个部分?如果没有一些细节,说它崩溃是完全没用的。 首先感谢您的回复,因此当我尝试将我的持久存储添加到我的持久存储协调器时它会崩溃,并出现错误 CoreData: 错误:读取元数据 plist 数据字节失败: 【参考方案1】:

根据您在http://openradar.io/15555487 的评论和错误报告,我猜测完整的消息类似于:

CoreData: error: failure reading metadata plist with data bytes: <33>
Unable to open database. Error: The file couldn’t be opened because it isn’t in the correct format.
Info: 
    NSUnderlyingException = "An error <null> occurred converting the metadata plist data: <33>";

还基于该报告以及您的源代码:您几乎可以肯定在迁移后留下旧的walshm 文件,这会导致迁移后出现问题。从 iOS 7 开始,Core Data 使用 WAL 模式的日志。这意味着在复制或删除持久存储时,您需要担心一些额外的文件。如果你的商店文件名为foo.sqlite,那么在同一目录下还有foo.sqlite-walfoo.sqlite-shm

您的代码删除了旧的 SQLite 文件并将其替换为新文件,但保留了现有的日志文件。这会导致数据不一致,因为日志文件不再对应于主 SQLite 文件。 SQLite 和 Core Data 无法理解剩下的内容,因此应用程序崩溃了。

解决方案最有可能确保清理多余的文件。当您拨打此电话时:

success = [[NSFileManager defaultManager] removeItemAtURL:storeURL error:error];

...同时删除两个额外的文件。

对于未来的工作,将持久性存储文件放在其自己的目录中而没有其他文件是很有用的。然后,如果您需要删除存储,只需一步即可删除目录,而无需关心 SQLite 或 Core Data 可能创建的其他额外文件。

【讨论】:

以上是关于iOS 7 中的 CoreData 迁移的主要内容,如果未能解决你的问题,请参考以下文章

Coredata 手动迁移

iOS 7 中的 iCloud、Core Data 和来自 Web 服务的数据

Core Data 轻量级迁移 - 现有实体是不是添加了新属性?

在 Core Data 中进行重量级迁移时尝试迁移 nil 属性值

如何将一个 Core Data 模型迁移到一个全新的模型?

iOS Core Data 不执行轻量级迁移