2013-04-22 2 views
0

Первый вопрос здесь, и я пробовал кучу вещей и не могу понять это.
Основные данные с 2-мя лицами с к-многим в обоих направленияхИзвлечение данных ядра Сохранение отношения при вставке объекта (одновременно)

A<<---->>B
A объект имеет имя в качестве атрибута, и отношения Bs

Первый контроллер перечисляет все A сущности и у меня есть второй контроллер для добавьте A объектов, и я хочу, чтобы он сохранял значение по умолчанию B в его отношениях.

В подготовке к Segue у меня есть этот код:

if ([[segue identifier] isEqualToString:@"addAEntitySegue"]) { 

    AddAEntityViewController *addAEntityViewController = [segue destinationViewController]; 
    addAEntityViewController.delegate = self; 
    addAEntityViewController.managedObjectContext = self.managedObjectContext; 

    NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; 
    self.addingManagedObjectContext = addingContext; 

    [addingManagedObjectContext setPersistentStoreCoordinator:[[fetchedResultsController managedObjectContext] persistentStoreCoordinator]]; 

    addAEntityViewController.A = [NSEntityDescription insertNewObjectForEntityForName:@"A" inManagedObjectContext:addingContext]; 

    UIBarButtonItem *saveButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave 
                      target:addAEntityViewController 
                       action:@selector(save:)]; 
    addAEntityViewController.navigationItem.rightBarButtonItem = saveButton; 

} 

В addAEntityViewController я есть это, чтобы спасти

-(IBAction)save:(id)sender 
{ 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"B"             inManagedObjectContext:self.managedObjectContext]; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",[defaults objectForKey:@"BDefault"]]; 

    [fetchRequest setEntity:entity]; 
    [fetchRequest setPredicate:predicate]; 

    //Set the batch size to a suitable number 
    [fetchRequest setFetchBatchSize:20]; 
    NSError *error; 

    self.A.name = textFieldVal; 

    [self.A addBObject:[[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] objectAtIndex:0]]; 

    NSLog(@"A = %@", self.A.Bs); 

    [self.delegate addAEntityViewController:self didFinishWithSave:YES]; 
} 

В addAEntityViewController все сейвы правильно даже NSLog(@"A = %@", self.A.Bs); заявление показывает B. Но когда делегат сохраняет в первом контроллере (AEntityViewController), он сохраняет только A.name, но не отношения A.Bs, я не могу понять, что не так.

Вот метод делегата:

-(void) addAEntityViewController:self didFinishWithSave:YES{ 
if (save) { 
    NSLog(@"saveworkouts"); 

    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; 
} 

Как я сказал, что это экономит A объект, но не отношения к B, хотя отношения к B правильно сохранены в addAEntityViewController (второй вид). NSLOg из A.Bs - null.

ответ

0

Во-первых я считаю, что эта линия:
addAEntityViewController = self.managedObjectContext;
должно быть:
addAEntityViewController.managedObjectContext = self.managedObjectContext;

, но это тоже было бы неправильно.
должно быть получение addingContext вы создали впоследствии:
addAEntityViewController.managedObjectContext = addingContext;

Я немного удивлен, что ваше приложение не разбился, как вы смешиваете управляемые объекты из 2-х разных контекстах.

+0

Вы по-прежнему используете неправильный контекст в 'addAEntityViewController', он должен быть установлен в' addContext' (объект контекста A был создан) –

+0

Объект A задан в файле managedObjectContext, но не вставлен, пока делегат не вставит его в addContext, что должно быть хорошо. Ошибка имени A.name не возникает. Это отношение A.Bs также не вставлено. Я чувствую, что отношения не вставлены до тех пор, пока сущность не будет сохранена. – figures

+0

Вот что я пытаюсь прояснить. Объект Bs извлекается в 'managedObjectContext' первого контроллера представления. чтобы доказать, что используйте быстрое исправление: вместо '[self.A addBObject: [[self.managedObjectContext executeFetchRequest: ошибка fetchRequest: & error] objectAtIndex: 0]];' use '[self.A addBObject: [[self.A. managedObjectContext executeFetchRequest: ошибка fetchRequest: & error] objectAtIndex: 0]]; ' –

 Смежные вопросы

  • Нет связанных вопросов^_^