私はそれを理解しました。最初に、永続ストア コーディネーターを作成するときに次のオプションを設定します。
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 を使用して、マッピング モデルで、ENTITY MAPPINGS namedInstanceToInstance
のマッピング ポリシーを に設定しMyPolicy
ます。
このメソッドは、インスタンス オブジェクトごとに 1 回呼び出されます。私の質問では、これを行う必要があります:
-(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 の移行ポリシー編集ウィンドウで値式を設定する必要はなく、空白のままにしておく必要があることに注意してください。