删除 Coredata 对象

3

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

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中的对象。


当我尝试这个时,我得到了以下错误 -[NSCFNumber objectID]: 无法识别的选择器发送到实例0xaa004f0。有什么想法吗? - James Dunay
哦,我不确定你的数组中有什么,假设它是一个NSManagedObject(或子类)。您需要从NSManagedObject获取objectID,并将其作为参数传递给MOC,这将返回相同的托管对象,但在当前上下文中,然后您可以删除它。从您最初的问题中,ErgTimes类是什么,以及它的Twok属性是什么? - Daniel Thorpe
1
哦,抱歉,你只需要调用[managedObjectContext deleteObject:[managedObjectContext objectWithID:[info objectID]]]; - Daniel Thorpe
ErgTimes是一个NSManagedObject,其中包含一个名为TwoK的浮点属性。 - James Dunay
谢谢你的回答!!我省了很多时间!! - NetDeveloper

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

这是我检索对象的方式,你看有什么问题吗? NSEntityDescription *entity = [NSEntityDescription entityForName:@"UserNumber" inManagedObjectContext:managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entity];NSSortDescriptor *pinNumbers = [[NSSortDescriptor alloc] initWithKey:@"PIN" ascending:NO]; NSArray *sortDescriptors = [NSArray arrayWithObject:pinNumbers]; [request setSortDescriptors:sortDescriptors]; NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy]; - James Dunay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接