具有多个映射模型的复杂核心数据迁移

Posted

技术标签:

【中文标题】具有多个映射模型的复杂核心数据迁移【英文标题】:Complex Core Data Migration with Multiple Mapping Models 【发布时间】:2014-01-30 17:38:04 【问题描述】:

我们有一个非常复杂的核心数据模型,其中包含足够的数据来支持多个映射模型。我们在理解创建跨越映射模型的关系的要求时遇到了问题。下面的代码是我们尝试在目标上下文中查找相关对象并设置关系的最新尝试。现在我们确实意识到我们不需要特定的对象类型和关系名称,但我们只是试图在处理其他 300 个关系之前,在一个实体上进行小规模的工作。帮助!!!马库斯·扎拉你在哪里?其他人有什么建议吗?

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;

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

所以代替这个:

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

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

【讨论】:

好的,这有点晚了,但这是对我的回答的回复吗?

以上是关于具有多个映射模型的复杂核心数据迁移的主要内容,如果未能解决你的问题,请参考以下文章

使用映射模型在核心数据对象模型之间迁移

多对多的核心数据迁移

核心数据版本控制 - 需要多个映射模型

核心数据迁移 - 找不到迁移的映射模型

没有找到适合核心数据迁移的映射模型

将多个值传递给核心数据迁移策略函数