Первый вопрос здесь, и я пробовал кучу вещей и не могу понять это.
Основные данные с 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.
Вы по-прежнему используете неправильный контекст в 'addAEntityViewController', он должен быть установлен в' addContext' (объект контекста A был создан) –
Объект A задан в файле managedObjectContext, но не вставлен, пока делегат не вставит его в addContext, что должно быть хорошо. Ошибка имени A.name не возникает. Это отношение A.Bs также не вставлено. Я чувствую, что отношения не вставлены до тех пор, пока сущность не будет сохранена. – figures
Вот что я пытаюсь прояснить. Объект Bs извлекается в 'managedObjectContext' первого контроллера представления. чтобы доказать, что используйте быстрое исправление: вместо '[self.A addBObject: [[self.managedObjectContext executeFetchRequest: ошибка fetchRequest: & error] objectAtIndex: 0]];' use '[self.A addBObject: [[self.A. managedObjectContext executeFetchRequest: ошибка fetchRequest: & error] objectAtIndex: 0]]; ' –