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

zir*_*isp 4 migration core-data ios

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

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

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

UPDATE

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

Nic*_*Kuh 12

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

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

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

我在这篇博客文章中记录了完整的源代码解决方案:

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

  • 在iOS9 SDK下部署到iOS 8时,此错误似乎已修复 (2认同)