我之前处理过轻量级迁移以及映射基本更改,但是我已经用Google搜索并溢出,并且没有找到类似的情况,其中实体名称保持不变,但是属性类型正在从int变为string(我认为这很容易做到)
我认为通过继承NSEntityMigrationPolicy,我在正确的轨道上,然后我将mappingmodel中的自定义策略字段设置为此子类(即使在Xcode重新启动后它也没有自动完成...)
但是我发现createDestinationInstancesForSourceInstance没有被调用
现在,因为我正在处理自定义映射模型和策略,我是否还应该推断映射模型,但是在持久存储中自动关闭迁移?
NSDictionary *options = @{NSMigratePersistentStoresAutomaticallyOption:@NO,
NSInferMappingModelAutomaticallyOption:@YES};
非常感谢任何帮助!
我真的希望在属性映射表达式中能够执行类似$ source.incrementer.string的操作:)
答案 0 :(得分:7)
你不能使用轻量级迁移,所以它有点难(感谢Apple),但并非不可能
在Xcode 7.1中一步一步:
<强> 1。创建新的模型版本:
.xcdatamodeld
型号 - &gt; Editor
- &gt; Add model version ...
attribute type
<强> 2。自定义核心数据映射模型
New file -> Mapping Model
(核心数据 - &gt;映射模型)source
(来自型号)和target
(模型)版本的模型NameToName
。更改此文件中目标实体中已更改属性的值表达式反映了您需要的值:FUNCTION($entityPolicy, "<*transformingMethodName*>" , $source.<*attributeName*>)
- transformingMethodName:将调用以转换属性类型的自定义方法。 (将在下一步中定义 - 保持)
- attributeName:您更改的属性名称
答案 1 :(得分:3)
首先,您是否尝试过轻量级迁移,看看它是否能解决这个问题?就SQLite而言,它并不关心你是否正在将int更改为varchar,并且应该能够轻松地完成它。
就映射模型而言,当Core Data找到该迁移的映射模型时,持久性存储中的选项将自动被覆盖。因此,您无需关闭这些选项。
对于重量级迁移,您需要实现几种生命周期方法才能使其正常工作,仅实现-createDestinationInstancesForSourceInstance...
可能不足以正确识别和使用该类。我建议使用断点删除所有方法并跟踪哪些方法被调用。我有一段时间没有进行大量迁移,所以我对所需方法的记忆是模糊的。
话虽如此,为此进行大量迁移是解决此问题的一种非常昂贵的方法。虽然它是正确的方式,但实际上并非最佳方式。我会考虑做其他事情(假设轻量级迁移不“只是工作”):
我建议选择这些选项,因为重量级的迁移非常繁重。它会产生内存问题,特别是如果您的数据存储甚至是远程大的话。它会将数据模型的两个副本加载到内存中以进行迁移。许多iOS应用程序无法处理。它也很慢,可能会导致发射问题。