ios - 选择允许外部存储时,iPhone 核心数据迁移导致二进制数据丢失

标签 ios core-data migration

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

我尝试添加一个映射模型然后迁移,但结果是一样的。存储的“二进制数据”是 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 生成的新的空外部存储文件夹。

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

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

关于ios - 选择允许外部存储时,iPhone 核心数据迁移导致二进制数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10312460/

相关文章:

ios - 归档我的项目时 Apple Mach-O 链接器错误

ios - 核心数据填充在模拟器中但不移动到设备

php - Laravel migrate - 一次完成多个迁移(文件)

iOS 12 特定问题 : Core Data External Storage Binary Data corruption

ios - 如何对 NSDictionary 数组进行排序

ios - XCode7、Swift 2、使用解析数据填充 TableView

ios - iPhone coredata删除通过关系连接的两个实体之间的记录

ios - 快速匹配针头和大海捞针的最佳方法

php - 您将 PHP 4 迁移到 PHP 5 的经验

database - 在设置项目中管理 Entity Framework 代码优先迁移