2011-06-13 102 views
3

我有一个使用coredata的项目,我正试图从我存储的内容中删除。但我不断收到这个错误。删除对象Coredata

An NSManagedObjectContext cannot delete objects in other contexts. 

我看着苹果公司不得不说,从我可以告诉我有它正确的,但事情仍然关闭。有什么建议么?谢谢!

for (UserNumber *info in pinNumberArray) { 

     NSSet *time = [[NSSet alloc] initWithSet:info.Times]; 

     for (ErgTimes *ergTimes in time){ 

      NSMutableArray *temp = [[NSMutableArray alloc] initWithObjects:ergTimes.Twok, nil]; 
      NSManagedObject *eventToDelete = [temp objectAtIndex:0]; 
      [managedObjectContext deleteObject:eventToDelete]; 
     } 
    } 

回答

11

嗯,这可能是你的对象,上下文和线程混淆了。 NSManagedObjectContext不是线程安全的。要从上下文中删除一个对象,你需要首先将对象“提取”到上下文中,我猜你的被管理对象是由不同的MOC提取的。没有看到更多的代码,我不知道。

但是,有一个相对简单的修复方法。在你的for循环中,做这件事而不是

for (ErgTimes *ergTimes in time){ 
    NSMutableArray *temp = [[NSMutableArray alloc] initWithObjects:ergTimes.Twok, nil]; 
    NSManagedObject *eventToDelete = [managedObjectContext objectWithID:[[temp objectAtIndex:0] objectID]]; 
    [managedObjectContext deleteObject:eventToDelete]; 
} 

这是做什么是获取目前使用其对象,它是线程安全的MOC中的对象。

+0

当我尝试,我得到以下错误 - [NSCFNumber objectID]:无法识别的选择发送到实例0xaa004f0。有什么想法吗? – 2011-06-13 21:36:51

+0

哦,我不确定你的数组是什么,假设它是一个NSManagedObject(或子类)。您需要从您的NSManagedObject获取对象ID,并将其作为参数传递给MOC,它将返回相同的受管对象,但在当前上下文中,然后可以删除它们。从你原来的问题来看,什么是ErgTimes类,它是Twok属性? – 2011-06-14 00:28:48

+1

哦,对不起,你只需要调用[managedObjectContext deleteObject:[managedObjectContext objectWithID:[info objectID]]]; – 2011-06-14 00:32:25

0

您必须使用相同的NSManagedObjectContext您用于获取要删除它们的对象。最简单的解决方案:使用与每个对象关联的managedObjectContext来删除它。像这样:

for (UserNumber *info in pinNumberArray) { 

    NSSet *time = [[NSSet alloc] initWithSet:info.Times]; 

    for (ErgTimes *ergTimes in time){ 

     NSMutableArray *temp = [[NSMutableArray alloc] initWithObjects:ergTimes.Twok, nil]; 
     NSManagedObject *eventToDelete = [temp objectAtIndex:0]; 
     [eventToDelete.managedObjectContext deleteObject:eventToDelete]; 
    } 
} 
+0

这是我如何获取对象,你能看到这个问题吗? NSEntityDescription * entity = [NSEntityDescription entityForName:@“UserNumber”inManagedObjectContext:managedObjectContext]; NSFetchRequest * request = [[NSFetchRequest alloc] init]; [request setEntity:entity]; NSSortDescriptor * pinNumbers = [[NSSortDescriptor alloc] initWithKey:@“PIN”升序:NO]; NSArray * sortDescriptors = [NSArray arrayWithObject:pinNumbers]; [request setSortDescriptors:sortDescriptors]; NSMutableArray * mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; – 2011-06-13 23:09:13