2013-04-22 42 views
0

第一個問題在這裏,我已經嘗試了一堆東西,無法弄清楚。
核心數據用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.BsNSLOg爲空。

回答

0

首先,我認爲,這條線:
addAEntityViewController = self.managedObjectContext;
應爲:
addAEntityViewController.managedObjectContext = self.managedObjectContext;

而且這也將是錯誤的。
應該得到addingContext你算賬創建:
addAEntityViewController.managedObjectContext = addingContext;

我有點吃驚,你的應用程序沒有崩潰,因爲你是混合管理的2周不同的上下文對象。

+0

「addAEntityViewController」中仍然使用了錯誤的上下文,它應該設置爲「addsContext」(創建上下文實體A) – 2013-04-22 10:10:31

+0

A實體在managedObjectContext中設置,但不會插入,直到委託將其插入addsContext,這應該很好。 A.name得到保存沒有問題。這也是沒有被插入的A.Bs關係。我有一種感覺,在實體保存之前,關係不會被插入。 – figures 2013-04-22 10:28:58

+0

這就是我想說明的。 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