将核心数据属性类型从Integer32更改为String

Stu*_* P. 5 migration core-data objective-c ios

我之前处理过轻量级迁移以及映射基本更改,但是我已经google了,并且没有找到类似的情况,其中实体名称保持不变,但属性类型正在从int更改为string(我认为很容易做到的事情)

我认为通过继承NSEntityMigrationPolicy,我在正确的轨道上,然后我将mappingmodel中的自定义策略字段设置为此子类(即使在Xcode重新启动后它也没有自动完成...)

在此输入图像描述

但我发现createDestinationInstancesForSourceInstance没有被调用 在此输入图像描述

现在,因为我正在处理自定义映射模型和策略,我是否还应该推断映射模型,但在持久存储中自动关闭迁移?

NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption:@NO,
                          NSInferMappingModelAutomaticallyOption:@YES};
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!

我真的希望在属性映射表达式中我可以做一些像$ source.incrementer.string :)

当前映射

Jak*_*lář 7

你不能使用轻量级迁移,所以它有点难(感谢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类的名称.)

注册迁移策略类