选择外部存储时,iPhone Core Data Migration会导致二进制数据丢失

时间:2012-04-25 09:02:37

标签: ios core-data migration

我正在尝试添加新模型。新模型将具有一个新实体以及从当前实体到新实体的关系。我创建了新模型并将其设置为当前模型。虽然一切正常,我可以访问新实体,但一些“二进制数据”条目是零。

我尝试添加映射模型然后进行迁移,但结果是一样的。存储的“二进制数据”是UIImage。正在迁移一些小缩略图。没有正在迁移全尺寸UIImages。

我在想,也许外部自动存储的实体(由于它们的大小)没有被迁移。

更新

我构建了一个存储图像集的小项目。我试图创建一个新模型,一切正常。然后我将新项目与旧项目进行比较,唯一的区别是“允许外部存储”。我在新项目中选择了这个选项,创建了一个新模型并且图片丢失了。

1 个答案:

答案 0 :(得分:12)

  

我在想,也许外部自动存储的实体(由于它们的大小)没有被迁移。

这正是发生的事情。这是一个Apple bug。超过一定大小的二进制数据由Core Data存储在Documents文件夹中的外部支持文件夹中。出于某种原因,在迁移过程中,Core Data只是擦除了外部存储文件夹 - gulp!因此,缩略图图像数据可以迁移,因为它不会存储在SQLite DB的外部,但更大的外部二进制文件会被删除。

我提出的解决方案是,在您的代码初始化核心数据模型的持久存储协调器之前,在尝试自动迁移之前运行一些检查。检查新模型是否与当前存储的模型兼容。如果不是,那么您就知道Core Data即将将旧模型迁移到新版本,这样做会擦除外部存储文件夹。在此之前,只需将外部存储文件夹移动到临时位置即可。迁移完成后,替换Core Data生成的新空外部存储文件夹。

我在本博文中记录了完整的源代码解决方案:

http://www.nickkuh.com/iphone/core-data-migration-woes-with-binary-data-and-external-storage-data-loss/2012/06/