5

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

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

我在想可能不会迁移自动存储在外部的实体(由于它们的大小)。

更新

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

4

1 回答 1

13

我在想可能不会迁移自动存储在外部的实体(由于它们的大小)。

这正是发生的事情。这是一个苹果的错误。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/

于 2012-06-09T14:22:32.997 回答