删除对象Coredata

时间:2011-06-13 20:42:23

标签: iphone objective-c xcode core-data

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

An NSManagedObjectContext cannot delete objects in other contexts.

我看着苹果必须说什么,从我能说出来我知道它是正确的,但有些东西仍然没有。有什么建议? THX!

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];
        }
    }  

2 个答案:

答案 0 :(得分: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];
}

这样做是使用其对象ID来获取当前正在使用的MOC中的对象,该对象是线程安全的。

答案 1 :(得分: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];
    }
}