我们有一个非常复杂的核心数据模型,有足够的数据来保证多个映射模型。我们在理解创建跨越映射模型的关系的要求时遇到了问题。下面的代码是我们最近的尝试,我们尝试在目标上下文中查找相关对象并设置关系。现在我们确实意识到我们不需要特定的对象类型和关系名称,但我们只是在我们处理其他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;
}
答案 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?