0

ここで最初の質問です。いろいろ試してみましたが、わかりません。
双方向の対多関係を持つ 2 つのエンティティを含むコア データ

A<<---->>B
Aエンティティには属性として名前があり、関係がありますBs

最初のコントローラーにはすべてのエンティティがリストされ、エンティティAを追加するための2番目のコントローラーがあり、その関係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エンティティは保存されますが、関係は(2番目のビュー)に正しく保存されBますが、関係は保存されません。ofはヌルです。BaddAEntityViewControllerNSLOgA.Bs

4

1 に答える 1

0

まず、この行:は次の
addAEntityViewController = self.managedObjectContext;
ようになるべきだと思います:
addAEntityViewController.managedObjectContext = self.managedObjectContext;

しかし、それも間違っています。後で作成した
ものを取得する必要があります:addingContext
addAEntityViewController.managedObjectContext = addingContext;

2 つの異なるコンテキストのマネージド オブジェクトを混在させているため、アプリがクラッシュしなかったことに少し驚いています。

于 2013-04-22T03:20:12.710 に答える