2014-01-30 38 views
1

我们有一个非常复杂的核心数据模型,其中包含足够的数据以保证多个映射模型。我们在理解创建跨越映射模型的关系的要求方面存在问题。下面的代码是我们尝试在目标上下文中查找相关对象并设置关系的最新尝试。现在我们意识到我们不需要特定的对象类型和关系名称,但我们只是试图在一个实体上小规模地开展这项工作,然后再处理其他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; 

}

回答

0

我的建议是彻底放弃NSMappingModel和做手工迁移。合并或分割实体时,添加新的默认数据et.c.我总是觉得这是最简单的路线。

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

0

所以作为代替:

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

我只想手动从源获取并插入到目标,然后创建所有通过核心数据方法的所有关系,然后再添加新的存储到PSCoordinator使用新模型?

+0

好吧,这有点晚了,但是这是对我的答案的答复? – Aderstedt