12

我有我的核心数据存储并使用标志“NSInferMappingModelAutomaticallyOption”,这样每当我对核心数据模型进行更改时,我首先创建一个新的模型版本,并且对数据模型的更改会自动迁移。

但是,我需要更改我的一个实体的属性类型。当我这样做时,自动迁移似乎不起作用,并且当我尝试运行我的应用程序时出现 Core Data 错误。

有什么方法可以设置它以继续自动模型迁移?

4

2 回答 2

15

您不能为此使用轻量级迁移,因此有点困难(感谢 Apple),但并非不可能

在 Xcode 7.1 中一步一步:

1. 创建新模型版本:

  1. 选择您的.xcdatamodeld型号 -> Editor->Add model version ...
  2. 编辑新模型的实体attribute type
  3. 将当前模型版本更改为新版本(文件检查器)。您应该看到绿色刻度线移动了。

当前型号

2.自定义Core Data映射模型

  1. New file -> Mapping Model(核心数据 -> 映射模型)
  2. 选择模型的source(从模型)和target(模型)版本
  3. 自定义映射模型包含以这种方式调用的实体映射:NameToName. 此文件中目标实体中已更改属性的更改值表达式反映了您需要的内容:FUNCTION($entityPolicy, "<*transformingMethodName*>" , $source.<*attributeName*>)

- transformingMethodName:将调用转换属性类型的自定义方法。(将在下一步中定义它 - 等等)

- attributeName:您更改的属性名称

  1. 创建<*EntityName*>TransformationPolicy类作为子类NSEntityMigrationPolicy
  2. 实现transformingMethodName你上面定义的。(在那里做你需要改变属性类型的事情)。确保您也将此方法添加到头文件中
  3. 将此类注册为映射模型中的自定义实体迁移策略(Model.xcmappingmodel -> 文件检查器 -> 第三列 -> 自定义策略 -> 输入您的 TransformationPolicy 类的名称。)

注册迁移策略类

于 2015-11-10T21:34:59.107 回答
13

轻量级迁移不支持属性类型更改:

为了使 Core Data 能够生成推断映射模型,更改必须符合明显的迁移模式,例如:

  • 简单添加新属性
  • 移除一个属性
  • 非可选属性变为可选
  • 可选属性变为非可选属性,并定义默认值
  • 重命名实体或属性

编辑

我假设您正在使用轻量级迁移。但正如斯科特指出的那样,也许你不是。如果你想使用自动迁移(这与轻量级迁移不同),你仍然可以通过提供映射模型来做到这一点。在这种情况下:

Core Data 将尝试在应用程序包中定位源和映射模型,并执行迁移。

但这种迁移不会是轻量级的。Core Data 将打开两个存储——源和目标——并复制内存中的所有实体。因此应用程序消耗的内存取决于存储中的数据量。

于 2013-07-08T20:08:02.233 回答