使用NSInferMappingModelAutomaticallyOption更改核心数据中的属性类型

Wis*_*erd 11 core-data objective-c core-data-migration

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

但是,我需要更改其中一个实体的属性类型.当我这样做时,自动迁移似乎不起作用,当我尝试运行我的应用程序时,我收到了Core Data错误.

有任何设置方法可以继续自动模型迁移吗?

Jak*_*lář 13

你不能使用轻量级迁移,所以它有点难(感谢Apple),但并非不可能

在Xcode 7.1中一步一步:

1.创建新的模型版本:

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

目前的型号

2.自定义核心数据映射模型

  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类的名称.)

注册迁移策略类


eof*_*ter 12

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

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

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

编辑

我假设你正在使用轻量级迁移.但斯科特指出,也许你不是.如果要使用自动迁移(与轻量级迁移不同),您仍可以通过提供映射模型来执行此操作.在这种情况下:

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

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

  • 虽然Wise Shepherd可能意味着轻量级迁移,但轻量级迁移和自动迁移并不相同.使用映射模型,迁移仍然可以自动发生(这是`NSMigratePersistentStoresAutomaticallyOption`的用途). (3认同)