Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 核心数据手动迁移_Ios_Core Data_Core Data Migration - Fatal编程技术网

Ios 核心数据手动迁移

Ios 核心数据手动迁移,ios,core-data,core-data-migration,Ios,Core Data,Core Data Migration,我正试图在我的项目中迁移到一个完全不同的新模型。这些更改对于轻量级迁移来说太多了,我认为最好的方法是迭代顶级对象,并自己设置所有属性和关系 如何将迁移过程设置为完全手动的。我研究了NSMigrationManager,它似乎需要一个NSMappingModel。我看到的唯一示例和教程使用了inferredMappingModelForSourceModel:destinationModel:error:,我无法使用它,因为它无法推断映射模型 我走的是正确的道路吗?如果是的话,我如何在代码中完全手

我正试图在我的项目中迁移到一个完全不同的新模型。这些更改对于轻量级迁移来说太多了,我认为最好的方法是迭代顶级对象,并自己设置所有属性和关系

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


我走的是正确的道路吗?如果是的话,我如何在代码中完全手动创建映射模型?感谢您的帮助。

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

这个过程相当简单,在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];
}
您可以阅读有关如何进行自定义迁移的更多信息。

请签出。它是一个开源的核心数据控制器,可以逐步处理轻量级和手动迁移

创建映射模型和所需的任何自定义策略后,只需执行此操作

// 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];
}