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>";
还基于该报告以及您的源代码:您几乎可以肯定在迁移后留下旧的wal
和shm
文件,这会导致迁移后出现问题。从 iOS 7 开始,Core Data 使用 WAL 模式的日志。这意味着在复制或删除持久存储时,您需要担心一些额外的文件。如果你的商店文件名为foo.sqlite
,那么在同一目录下还有foo.sqlite-wal
和foo.sqlite-shm
。
您的代码删除了旧的 SQLite 文件并将其替换为新文件,但保留了现有的日志文件。这会导致数据不一致,因为日志文件不再对应于主 SQLite 文件。 SQLite 和 Core Data 无法理解剩下的内容,因此应用程序崩溃了。
解决方案最有可能确保清理多余的文件。当您拨打此电话时:
success = [[NSFileManager defaultManager] removeItemAtURL:storeURL error:error];
...同时删除两个额外的文件。
对于未来的工作,将持久性存储文件放在其自己的目录中而没有其他文件是很有用的。然后,如果您需要删除存储,只需一步即可删除目录,而无需关心 SQLite 或 Core Data 可能创建的其他额外文件。
【讨论】:
以上是关于iOS 7 中的 CoreData 迁移的主要内容,如果未能解决你的问题,请参考以下文章
iOS 7 中的 iCloud、Core Data 和来自 Web 服务的数据
Core Data 轻量级迁移 - 现有实体是不是添加了新属性?