2013-01-02 68 views
2

我遇到了一个问题,NSManagedObjectContextexecuteFetchRequest:error:正在返回一个尚未插入上下文的NSManagedObjects数组。核心数据:executeFetchRequest:错误:返回没有managedObjectContext的对象

我的方法:

- (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 Class Reference,该对象自动注册获取managedObjectContext,所以我觉得registeredObjects返回一个空集是可疑的。

我很难过,所以希望有人能发现我的代码有问题,或者知道我错过了一些问题。

+0

你是什么意思没有被插入上下文中? – Levi

+0

我的意思是这些对象都有一个零的managedObjectContext。 – ryanipete

+0

我不确定它是否会有所帮助,但是在插入有问题的对象并在运行上面的代码之前,我会尝试在托管对象上下文中调用processPendingChanges。也许只是把它作为上面方法的第一行。 –

回答

2

这是被管理对象删除并保存其上下文后更新管理对象的一种症状。

我一直在视图控制器中引用Foo实例。我从托管对象上下文中删除了所有Foo对象,然后更新了Foo实例,然后尝试再次删除所有Foo对象。

此问题已帮助我追查原因:How can I tell whether an `NSManagedObject` has been deleted?

相关问题