NSManagedObjectContext无法删除其他上下文中的对象

cet*_*cet 19 iphone core-data nsmanagedobject

我有两个实体,每个实体都在自己的UITableView部分显示.

我已启用编辑功能,允许用户通过向右滑动来删除行.这适用于第一个实体,但是当我尝试删除第二个实体中的对象时,我收到此错误:

An NSManagedObjectContext cannot delete objects in other contexts
Run Code Online (Sandbox Code Playgroud)

我得到了错误所说的内容,但我看不出它在这里是如何适用的.我使用对上下文的保留引用来创建,获取和删除数据库中的所有对象,因此我确信只有一个上下文.我也没有使用多线程.知道会发生什么吗?

小智 24

NSManagedObject从同一实例获取的上下文是否与您用来删除的上下文相同NSManagedObject?如果没有,您需要:

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

要么

  • 如果你必须使用的两种不同的情况NSManagedObjectContext,然后拿到objectIDNSManagedObject你从第一方面得到的,所以您可以稍后致电:

    [context deleteObject:[context objectWithID:aObjectID]];
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 对于在Google搜索中遇到此问题的其他人,如果您将无效对象或其他错误代码传递给`[managedObjectContext deleteObject],则可能会收到此错误;`我在事故中传递了一个`NSNumber*`并且它给了我这个错误而不是告诉我我应该传递一个`NSManagedObject*`. (14认同)
  • 只是添加到@RileyDutton的答案 - 如果你只获取了他的托管对象id(通过`... setResultType:NSManagedObjectIDType]`for NSFetchRequest`,你就无法删除一个对象. (3认同)

小智 7

我用这个:

  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()
}
Run Code Online (Sandbox Code Playgroud)

基本上,您要删除的对象很可能是由NSPercientContainerviewContext提供的。因此尝试从私有后台上下文中删除是行不通的。