2014-07-26 110 views
2

我试图迁移到我的项目中的一个新的完全不同的模型。对于轻量级迁移,这些更改太多了,我认为最好的方法是遍历顶层对象并自己设置所有属性和关系。核心数据手动迁移

如何将迁移过程设置为完全手动。我已经看过NSMigrationManager,这似乎需要一个NSMappingModel。我见过的唯一示例和教程使用inferredMappingModelForSourceModel:destinationModel:error:,这是我无法使用的,因为它无法推断映射模型。

我在正确的道路上,如果是这样我怎么能在代码中完全手动创建一个映射模型?谢谢您的帮助。

回答

1

如果您的模型更改至少有一个源和目标实体级别映射(例如,您的旧模型中有一个Vehicle实体,现在您想将该数据迁移到Car),那么您可以使用自定义映射模型与迁移策略。

该过程相当简单,在Xcode中,尝试添加一个新的映射模型文件到您的项目中,选择源模型版本和目标模型版本。 Xcode试图找出源和目标实体的属性之间的映射关系。如果无法执行,则只需将映射留空即可,您可以设置自己的映射。

如果您想在映射过程中执行除简单赋值,消隐或设置属性的默认值之外的其他操作,请使用名为NSEntityMigrationPolicy的东西。创建自己的子类,并实现这个方法做你的自定义映射:

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)instance 
             entityMapping:(NSEntityMapping *)mapping 
              manager:(NSMigrationManager *)manager 
               error:(NSError **)error { 
    NSArray *_properties = [mapping attributeMappings]; 
    for (NSPropertyMapping *_property in _properties) { 
     if ([[_property name] isEqualToString:@"companyName"]) { 
      NSExpression *_expression = [NSExpression expressionForConstantValue:@"10to1"]; 
      [_property setValueExpression:_expression]; 
     } 
    } 

    return [super createDestinationInstancesForSourceInstance:instance 
               entityMapping:mapping 
                 manager:manager 
                 error:error]; 
} 

您可以阅读更多关于如何做一个自定义迁移here

0

结账CDWrangler。它是一个开源的Core Data控制器,可以逐步处理轻量级和手动迁移。

后您创建映射模型,你需要的任何自定义策略,你只需要做到这一点

// Migration 
if ([[CDWrangler sharedWrangler] isMigrationNeeded]) { 
    // The key is the name of your starting model, and the value is the name of your mapping model. In this example they are Model.xcdatamodel and MappingModel.xcmappingmodel 
    [CDWrangler sharedWrangler].mappingsForModels = @{@"Model": @"MappingModel"}; 
    [[CDWrangler sharedWrangler] migrate]; 
}