2

コンテキストに挿入されていない配列をNSManagedObjectContext'sexecuteFetchRequest:error:が返すという問題が発生しています。NSManagedObjects

私の方法:

- (NSArray *)deleteAllObjectsWithEntityName:(NSString *)entityName {
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entityDesc = [NSEntityDescription entityForName:entityName inManagedObjectContext:self.managedObjectContext];
    fetchRequest.entity = entityDesc;
    NSError *error = nil;
    NSArray *managedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

    // [[self.managedObjectContext registeredObjects] count] : 0
    // [[self.managedObjectContext insertedObjects] count] : 0
    //
    // managedObjects.count : 1
    // error : nil
    //
    // managedObjects[0] : <Foo: 0xe98c1d0>
    // managedObjects[0].isDeleted : NO
    // managedObjects[0].isFault : NO
    // managedObjects[0].isInserted : NO
    // managedObjects[0].managedObjectContext : nil
    //
    // [NSThread isMainThread] : YES
    //
    // self.managedObjectContext : <NSManagedObjectContext: 0xe97d840>
    //

    for (NSManagedObject *anObject in managedObjects) {
        [self.managedObjectContext deleteObject:managedObject];
    }

    [self.managedObjectContext save:&error];

    // error : Error Domain=NSCocoaErrorDomain Code=134030 \
    // "The operation couldn’t be completed. (Cocoa error 134030.)" UserInfo=0x8b6d260 \
    // {NSAffectedObjectsErrorKey=(
    //     "<Foo: 0x10464910> (entity: Foo; id: 0x10464950 <x-coredata:///Job/tE5188F9B-9DC4-4EA2-8636-7790587E114F242> ; data: {...})"
    // ), \
    // NSUnderlyingException=Cannot update object that was never inserted.},
}

self.managedObjectContext常にメインスレッドで作成されることを確認しました。

NSManagedObjectContextクラスリファレンスによると、オブジェクトはフェッチしているmanagedObjectContextに自動的に登録されるためregisteredObjects、空のセットを返すのは疑わしいと思います。

私は困惑しているので、誰かが私のコードに何か問題があることを発見できること、または私が見逃したいくつかの落とし穴について知っていることを望んでいます。

4

1 に答える 1

2

これは、管理対象オブジェクトが削除され、そのコンテキストが保存された後に、管理対象オブジェクトを更新した場合の症状です。

ビューコントローラーで Foo インスタンスへの参照を保持していました。管理オブジェクト コンテキストからすべての Foo オブジェクトを削除し、Foo インスタンスを更新してから、すべての Foo オブジェクトを再度削除しようとしました。

この質問は、原因を追跡するのに役立ちました: `NSManagedObject` が削除されたかどうかを確認するにはどうすればよいですか? .

于 2013-01-03T02:55:18.410 に答える