1

Parent Child NSManagedObjectContext に問題があります。問題は、EventsPlanner クラスで子 NSManagedObjectContext を使用してランダム イベントを作成することです。気づいたらメインの NSManagedObjectContext に直接保存すればうまくいくのですが、子を使って親に更新したいです。

「+」ボタンを押すと新しいイベントが追加されますが、空に見えます。

サンプル プロジェクトを追加しました --> https://dl.dropbox.com/u/63377498/ParentChildExperiment.zip

子 NSManagedObjectContext の作成:

- (NSManagedObjectContext *)managedObjectContext
{
    if (_managedObjectContext != nil) {
        return _managedObjectContext;
    }

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
    _managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
    [_managedObjectContext setUndoManager:nil];
    [_managedObjectContext setParentContext:appDelegate.managedObjectContext];
    return _managedObjectContext;
}

保存:

Event *event = [[Event alloc] initWithEntity:self.eventEntity insertIntoManagedObjectContext:nil];
event.title = ...;
event.location = ...;
event.timeStamp = ...;

[self.managedObjectContext insertObject:event];

[self.managedObjectContext performBlock:^{

NSError *childError = nil;
if ([self.managedObjectContext save:&childError]) {
    [self.managedObjectContext.parentContext performBlock:^{

        NSError *parentError = nil;

        if (![self.managedObjectContext.parentContext save:&parentError]) {
            NSLog(@"parent error: %@", [parentError description]);
            abort();

        }                        
    }];
} else {
    NSLog(@"child error: %@", [childError description]);
    abort();
}}];

ありがとう!

4

1 に答える 1

1

これが機能しない正確な理由を説明することはできませんが、問題は、管理対象オブジェクトコンテキストなしでイベントエンティティを作成し、後でMOCに追加することであるようです。

// Create random object
Event *event = [[Event alloc] initWithEntity:self.eventEntity insertIntoManagedObjectContext:nil];
event.title = ...;
event.location = ...;
event.timeStamp = ...;

// Insert object
[self.managedObjectContext insertObject:event];

これをに変更すると

Event *event = [[Event alloc] initWithEntity:self.eventEntity
              insertIntoManagedObjectContext:self.managedObjectContext];
event.title = ...;
event.location = ...;
event.timeStamp = ...;

その後、新しいイベントがテーブルビューに正しく表示されます。

于 2012-10-15T17:18:15.240 に答える