我已经想通了。
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];
if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storeURL options:options error:&error])
{
//other code handle error
}
创建Xcode的一个映射模型,设置它的源代码版本和目标版本: 第一,创造持久存储协调时,设置这些选项。
创建一个NSEntityMigrationPolicy的子类,将其命名为MyPolicy
,覆盖该方法。
-(BOOL)createRelationshipsForDestinationInstance:(NSManagedObject *)dInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error
当调用此方法时,所有managedObjects已在目标上下文中创建,但它们的关系不是。 在这个方法中,检查什么实体是dInstance,并为它建立关系。
使用Xcode,在您的映射模型中,将名为InstanceToInstance
的ENTITY MAPPINGS的映射策略设置为MyPolicy
。
此方法将针对每个实例对象调用一次。 我的问题,我应该这样做:
-(BOOL)createRelationshipsForDestinationInstance:(NSManagedObject *)dInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error{
NSError *superError = nil;
BOOL mappingSuccess = [super createRelationshipsForDestinationInstance:dInstance entityMapping:mapping manager:manager error:&superError];
if ([dInstance.entity.name isEqualToString:@"Rule"]){
Instance *instance = (Instance*)dInstance;
NSFetchRequest *fetch = [[NSFetchRequest alloc] initWithEntityName:@"Instance"];
fetch.predicate = [NSPredicate predicateWithFormat:@"identifier == %@",instance.identifier];
NSArray *result = [manager.destinationContext executeFetchRequest:fetch];
Rule *rule = [result objectAtIndex:0];
instance.rule = rule;
}
return YES;
}
然后,规则和实例之间的关系船将要创建的应用程序启动时。
另请注意,由NSEntityMigrationPolicy的子类创建的关系不需要在xcode的迁移策略编辑窗口中设置值表达式,只需将其留空即可。
谢谢tkanzakic,下次我会在我的格式上做得很好:) – CarmeloS