Базовые данные - как установить связь между двумя объектами в разных контекстах

В моем приложении у меня есть следующая модель CoreData: Foo имеет много сущностей Bar: Foo <---- >> Bar.

Чтобы добавить новую сущность Foo, я создаю новый MOC, в котором я создаю новый экземпляр Foo. Это отображает AddFooViewController. Здесь я могу либо отменить, либо сохранить, либо добавить новый объект Bar для этого созданного объекта Foo. Проблема возникает, когда я добавляю новую сущность Bar.

Позвольте мне объяснить подробно: новая сущность Bar создается в совершенно новом MOC. Затем, когда я решаю сохранить сущность Bar, я пытаюсь объединить "Add Bar MOC" и "Add Foo MOC". Это должно быть сделано с помощью этого кода:

- (IBAction)addNewBar {
    BarAddViewController *addViewController = [[BarAddViewController alloc] initWithStyle:UITableViewStyleGrouped];

    NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] init];
    self.addingManagedObjectContext = addingContext;
    [addingContext release];


    [addingManagedObjectContext setPersistentStoreCoordinator:[self.managedObjectContext persistentStoreCoordinator]];

    // Create new bar
    Bar *bar = (Bar *)[NSEntityDescription insertNewObjectForEntityForName:@"Bar"                                                                      inManagedObjectContext:self.addingManagedObjectContext];
    bar.creationDate = [NSDate date];


    addViewController.delegate = self;
    addViewController.bar = bar;

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:addViewController];
    [self.navigationController presentModalViewController:navController animated:YES];

    [addViewController release];
    [navController release];
}

// Delegate method :
- (void)barAddViewController:(BarAddViewController *)controller didFinishWithSave:(BOOL)save {    
    // Dismiss the modal view to return to the main list
    [self dismissModalViewControllerAnimated:YES];

    // Save modifications
    if (save) {
        NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
        [dnc addObserver:self
                selector:@selector(addBarControllerContextDidSave:) 
                    name:NSManagedObjectContextDidSaveNotification 
                  object:addingManagedObjectContext];

        // Assign relationship here ???? foo.bars = bar;

        NSError *error;
        if (![addingManagedObjectContext save:&error]) {
            // Update to handle the error appropriately.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            exit(-1);  // Fail
        }

        [dnc removeObserver:self 
                       name:NSManagedObjectContextDidSaveNotification 
                     object:addingManagedObjectContext];
    } else {
        // Remove bar from addingManagedObjectContext
        [self.addingManagedObjectContext deleteObject:controller.bar];

        NSError *error;
        if (![addingManagedObjectContext save:&error]) {
            // Update to handle the error appropriately.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            exit(-1);  // Fail
        }
    }

    // Release the adding managed object context.
    self.addingManagedObjectContext = nil;
}

- (void)addBarControllerContextDidSave:(NSNotification*)saveNotification {   
    [self.managedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification];
}

Моя проблема в том, что я не знаю, где установить отношения между Foo и Баром. Я знаю, что могу установить только связь между двумя NSManagedObject, которые находятся в одном контексте. Кто-нибудь может мне помочь, пожалуйста?

заранее спасибо

1 ответ

Вам нужно загрузить обе сущности в одном и том же управляемом контексте, чтобы создать какую-либо связь (хотя, я думаю, вы уже поняли это!).

У вас есть Foo из первого контекста управляемого объекта - назовите его Foo1.

Foo *foo1 = {your initial Foo};

// Get a foo from the new managed context
NSManagedObjectID fooID = [foo1 managedObjectID];
Foo *foo2 = [addingManagedObjectContext objectWithID:fooID];

Теперь вы можете использовать Foo2 для создания отношений

Другие вопросы по тегам