核心数据迁移 - 如何将两个实体合并为一个

时间:2012-03-06 08:35:50

标签: ios core-data core-data-migration

我有一个包含两个实体的旧核心数据模型:

第一个实体

FirstString有一个属性:string1,即NSString

第二个实体

SecondString有一个属性:string2,即NSString

他们有一对多的关系:第一个实体< --->>第二实体。

新实体 - “ComboEntity” - 与第一实体和第二实体都有一对一的关系。

现在我有了新实体的核心数据模型

ComboEntity 有一个属性:fullString

问题:

如何迁移数据并将字符串1和字符串2合并为fullString?

谢谢!

2 个答案:

答案 0 :(得分:2)

您应该使用自定义映射政策。

  1. 创建从旧实体版本到新实体版本的映射模型
  2. 更改您的代码以使用自定义映射政策而非自动
  3. 编写自定义映射策略类,请参阅下面的示例:

  4. @interface FullStringFromTwoStringsMappingPolicy : NSEntityMigrationPolicy
    
    - (NSString *)fullStringForMyEntity:(MyEntity *)myEntity;
    
    @end
    
    @implementation FullStringFromTwoStringsMappingPolicy
    
    - (NSString *)fullStringForMyEntity:(MyEntity *)myEntity
    {
        return [NSString stringWithFormat:@"%@ %@", myEntity.string1, myEntity.string2];
    }
    
    @end
    

    在映射模型中,您将编写一个值表达式,如屏幕截图所示。而不是contactHashMD5,而是你的fullString属性。

    enter image description here

    致以最诚挚的问候,

    斯文。

答案 1 :(得分:0)

CoreData模型版本控制在iOS上有广泛的支持。基本上,您需要创建模型的新版本并在其中创建新实体(可能还留下旧实体)。然后,根据您的需要,您可以从框架中选择不同级别的迁移支持,从简单用nil填充新字段的“轻量级迁移”开始,直到“自定义实体迁移策略”允许您定义将使用nil的回调函数做任意复杂的迁移过程。见here

在您的情况下,您也可以手动执行迁移,在每个应用程序启动时(或仅检查一次)检查模型是否已经转换,如果没有,则运行一个循环,根据旧实体填充新实体。 / p>