【问题标题】:Delete object Coredata删除对象 Coredata
【发布时间】:2011-06-13 20:42:23
【问题描述】:

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

【问题讨论】:

    标签: iphone objective-c xcode core-data


    【解决方案1】:

    嗯,你可能把你的对象、上下文和线程搞混了。 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];
    }
    

    这样做是使用线程安全的 objectID 获取您当前使用的 MOC 中的对象。

    【讨论】:

    • 当我尝试得到以下错误 -[NSCFNumber objectID]: unrecognized selector sent to instance 0xaa004f0.有什么想法吗?
    • 哦,我不确定你的数组中有什么,假设它是一个 NSManagedObject(或子类)。您需要从您的 NSManagedObject 获取 objectID 并将其作为参数传递给 MOC,这将返回相同的托管对象,但在您当前的上下文中,然后您可以将其删除。从您最初的问题来看,ErgTimes 类是什么,它是 Twok 属性?
    • 哦,对不起,你只需要调用 [managedObjectContext deleteObject:[managedObjectContext objectWithID:[info objectID]]];
    • ErgTimes 是一个 NSManagesObject,TwoK 是它里面的一个 float 属性。
    • 感谢您的回答!!我节省了很多时间!
    【解决方案2】:

    您必须使用与获取对象相同的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]; [请求集合实体:实体]; NSSortDescriptor *pinNumbers = [[NSSortDescriptor alloc] initWithKey:@"PIN" 升序:NO]; NSArray *sortDescriptors = [NSArray arrayWithObject:pinNumbers]; [请求 setSortDescriptors:sortDescriptors]; NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    猜你喜欢
    • 2011-06-06
    • 1970-01-01
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多