我正在尝试添加一个新模型。新模型将具有一个新实体以及从当前实体到新实体的关系。我已经创建了新模型并将其设置为当前模型。尽管一切正常并且我可以访问新实体,但一些“二进制数据”条目为零。
我尝试添加一个映射模型然后迁移,但结果是一样的。存储的“二进制数据”是 UIImage。正在迁移一些小缩略图。未迁移全尺寸 UIImage。
我在想,也许自动存储在外部的实体(由于它们的大小)没有被迁移。
更新
我构建了一个存储图像集的小项目。我尝试创建一个新模型,一切正常。然后我将新项目与旧项目进行比较,唯一的区别是“允许外部存储”。我在新项目上选择了这个选项,创建了一个新模型,但图片丢失了。
最佳答案
I am thinking that maybe the entities that are automatically stored externally (due to their size) are not being migrated.
这正是发生的事情。这是一个苹果错误。超过一定大小的二进制数据由 Core Data 存储在 Documents 文件夹内的外部支持文件夹中。出于某种原因,在迁移过程中,Core Data 只是删除该外部存储文件夹 - gulp!所以缩略图数据可以正常迁移,因为它没有存储在 SQLite 数据库的外部,但更大的外部二进制文件只是被删除了。
我提出的解决方案是,当您的代码为您的 Core Data 模型初始化持久存储协调器时,在尝试自动迁移之前运行一些检查。检查新模型是否与当前存储的模型兼容。如果不是,那么您知道 Core Data 即将将您的旧模型迁移到新版本,这样做会删除外部存储文件夹。在此之前,只需将外部存储文件夹移动到一个临时位置即可。迁移完成后,替换由 Core Data 生成的新的空外部存储文件夹。
我在这篇博文中用源代码记录了完整的解决方案:
关于ios - 选择允许外部存储时,iPhone 核心数据迁移导致二进制数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10312460/