2011-05-02 77 views
17

我有两个实体,每个实体都在自己的UITableView部分显示。NSManagedObjectContext无法删除其他上下文中的对象

我已启用编辑以允许用户通过向右滑动来删除行。这第一个实体工作正常,但是当我尝试在第二实体删除一个对象,我得到这个错误:

An NSManagedObjectContext cannot delete objects in other contexts 

我得到的错误说什么,但我看不出它如何应用这里。我使用保留的引用来创建,获取和删除数据库中的所有对象,因此我确信只有一个上下文。我也没有使用多个线程。任何想法可能发生什么?

回答

22

是从同一个实例中获取NSManagedObject作为上下文来删除NSManagedObject的上下文吗?如果没有,您需要:

  • 对同一个NSManagedObjectContext具有共享引用,以便从您创建或从中获取的同一上下文中删除该对象。如果你没有使用多线程,那么你只需要在代码中调用[[NSManagedObjectContext alloc] init]。

  • 如果你使用的NSManagedObjectContext的两个不同的实例,那么您可以通过NSManagedObject从第一个方面得到的objectID,这样你可以稍后致电:

    [context deleteObject:[context objectWithID:aObjectID]];

    上下文之间的NSManagedObjectID是相同的,但NSManagedObject本身不是。

+0

我使用managedObjectContext伊娃在应用程序委托(放在那里通过Xcode中,当我创建的项目)。导致错误引用的代码使用[[[UIApplication sharedApplication]委托] managedObjectContext]。整个应用只有一个实例。 – cetcet 2011-05-03 05:44:20

+0

只需修复它。这是一个错字 - 与上下文无关。对不起,感谢您的帮助! – cetcet 2011-05-03 06:07:53

+14

对于任何人碰到这个即将在谷歌搜索,你可能会如果你是传递一个无效的对象或其他输入错误代码'[managedObjectContext DeleteObject的]收到此错误;'我是路过的'的NSNumber *'事故,它是给我这个错误,而不是告诉我我应该传递一个'NSManagedObject *'。 – 2011-10-25 10:36:33

-1

好吧,试试这个;这可以解决你的问题: -

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 
//delete Entity 
}); 

然后得到了同样的错误。

尝试删除主线程中的实体并解决此问题。

0

这个答案阐述了Riley Dutton关于错误信息被误导的评论中描述的情况。

当您传递的对象是而不是 NSManagedObject的子类别为deleteObject:时,将显示错误消息。 Riley只是通过明确传入错误的对象来解决问题,但我通过核心数据更改来到那里。

我的项目部署的目标设定为7.0,而这个代码工作,甚至没有在iOS 9.3上运行的错误:

NSArray *entries = @[self.colorList.colors, self.emotionList.emotions, self.shapeList.shapes]; 
    for (id entry in entries) { 
     [[self managedObjectContext] deleteObject:entry]; 
    } 

当我的项目部署目标更新到9.3,我开始的错误消息。

这里是entry说明:

Relationship 'colors' fault on managed object (0x7fd063420310) <MyColorList: 0x7fd063420310> (entity: MyColorList; id: 0xd000000000640006 <x-coredata://12556DEF-F77E-4EFF-AAE6-55E71A3F5420/MyColorList/p25> ; data: { 
    attachedThing = "0xd0000000000c0004 <x-coredata://12556DEF-F77E-4EFF-AAE6-55E71A3F5420/MyThing/p3>"; 
    colors = "<relationship fault: 0x7fd063468f30 'colors'>"; 
}) 

它看起来像苹果改变了当核心数据会引发故障,实际上是从持久存储协调拉动数据的规则。

这一修改解决了这个问题:

NSArray *entries = @[self.colorList.colors, self.emotionList.emotions, self.shapeList.shapes]; 
    for (id entry in entries) { 
     for (id e in entry) { 
      [[self managedObjectContext] deleteObject:e]; 
     } 
    } 

在这个时候,我不知道如果这是解决这个问题的理想方式,如果有更规范的方式来告诉核心数据引发故障并从磁盘读取数据。

0

我用这个:

func delete(object: YourManagedObject) { 
    guard let context = object.managedObjectContext else { return } 

    if context == self.viewContext { 
     context.delete(object) 
    } else { 
     self.performBackgroundTask { context in 
     context.delete(object) 
    } 
    } 

    try? self.viewContext.save() 
} 

基本上,这是很有可能的,你要删除的对象是由viewContext NSPersistentContainer提供。所以试图从私人背景上下文中删除将无法工作。

相关问题