第一個問題在這裏,我已經嘗試了一堆東西,無法弄清楚。
核心數據用2個實體對多的關係是雙向的核心數據獲取保存關係,同時插入實體(同時)
A<<---->>B
A
實體具有名稱作爲一個屬性,以及關係Bs
第一控制器列出所有A
實體和我有一個第二控制器,用於添加A
實體,我希望它保存在其關係中的默認B
。
在爲賽格瑞的準備我有這樣的代碼:
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
的關係在addAEntityViewController
(第二視圖)正確保存到B
的關係。 A.Bs
的NSLOg
爲空。
「addAEntityViewController」中仍然使用了錯誤的上下文,它應該設置爲「addsContext」(創建上下文實體A) – 2013-04-22 10:10:31
A實體在managedObjectContext中設置,但不會插入,直到委託將其插入addsContext,這應該很好。 A.name得到保存沒有問題。這也是沒有被插入的A.Bs關係。我有一種感覺,在實體保存之前,關係不會被插入。 – figures 2013-04-22 10:28:58
這就是我想說明的。 Bs實體在第一個視圖控制器的'managedObjectContext'中被提取。證明使用快速修復:而不是'[self.A addBObject:[[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] objectAtIndex:0]];'use'[self.A addBObject:[[self.A。 managedObjectContext executeFetchRequest:fetchRequest error:&error] objectAtIndex:0]];' – 2013-04-22 12:07:04