我有一个使用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];
}
}
答案 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];
}
}