使用多种映射模型的复杂核心数据迁移

时间:2014-01-30 17:38:04

标签: core-data-migration multiple-models

我们有一个非常复杂的核心数据模型,有足够的数据来保证多个映射模型。我们在理解创建跨越映射模型的关系的要求时遇到了问题。下面的代码是我们最近的尝试,我们尝试在目标上下文中查找相关对象并设置关系。现在我们确实意识到我们不需要特定的对象类型和关系名称,但我们只是在我们处理其他300个关系之前尝试使用一个实体进行小规模的工作。救命!!! Marcus Zarra你在哪儿?其他人有什么建议吗?

Link to picture of the Data Model

创建关系的代码......

- (BOOL)createRelationshipsForDestinationInstance:(NSManagedObject *)dInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error {

if ([mapping.name isEqualToString:@"ProductImageToProductImage"]) {

    [super createRelationshipsForDestinationInstance:dInstance entityMapping:mapping manager:manager error:error];

    NSArray *sources = [manager sourceInstancesForEntityMappingNamed:mapping.name destinationInstances:@[dInstance]];
    NSArray *destinations = [manager destinationInstancesForEntityMappingNamed:@"ProductImageToProductImage" sourceInstances:sources];

    NSManagedObject *sourceObj = [[sources objectAtIndex:0] valueForKey:@"product"];

    if (destinations.count == 1) {

        NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Product"];
        request.predicate = [NSPredicate predicateWithFormat:@"xID = %@",[sourceObj valueForKey:@"xID"]];
        ;
        NSArray *result = [manager.destinationContext executeFetchRequest:request error:error];
        if (result.count > 0) {
            Product *destProduct = (Product *)[result objectAtIndex:0];
            [dInstance setValue:destProduct forKey:@"product"];
        }

    } else if (destinations.count > 1) {
        NSLog(@"multiple products for %@",sources);
    }
}

return YES;

}

2 个答案:

答案 0 :(得分:0)

我的建议是完全放弃NSMappingModel并进行手动迁移。合并或拆分实体时,添加新的默认数据et.c.我总觉得这是最简单的路线。

要手动迁移,您可以按照任何顺序从源上下文中获取每个对象,然后根据需要创建目标对象。它可以是非常重复的代码,但您可以快速编写并轻松调试。

答案 1 :(得分:0)

代替这个:

        BOOL ok = [migrationManager migrateStoreFromURL:sourceStoreURL
                                               type:sourceStoreType
                                            options:sourceStoreOptions
                                   withMappingModel:mappingModel
                                   toDestinationURL:destinationStoreURL
                                    destinationType:destinationStoreType
                                 destinationOptions:destinationStoreOptions
                                              error:&error];

我只需从源手动获取并插入目标,然后通过Core Data方法创建所有关系,然后使用新模型将新商店添加到PSCoordinator?