删除 NSManagedObject 子类不会取消它的多对多关系

Posted

技术标签:

【中文标题】删除 NSManagedObject 子类不会取消它的多对多关系【英文标题】:Deleting NSManagedObject subclass not nullifying it's many-to-many relationship 【发布时间】:2014-11-18 15:55:06 【问题描述】:

我在 Swift 中使用 CoreData,我有两个实体。我们称他们为ItemTag。它们设置为基本的多对多(两者都有可选的项目/标签,无效,对多)关系,看起来类似于:

class Item: NSManagedObject 
  // Rest of attributes
  @NSManaged var tags: NSSet

设置关系可以正常工作,但是当我尝试删除项目时:

managedObjectContext.performBlockAndWait 
  managedObjectContext.deleteObject(item)
  managedObjectContext.save(/** it saves with no error */) 

它删除了项目对象,但它的任何标签都没有被更新,如果我在其他地方获取它们,它仍然有项目中的项目,但显然不会出错。 (并且 Z2TAGS 表仍然显示被删除的项目 id)。

我尝试在删除之前自己手动更新关系,但这并没有改变我在更新关系然后删除对象后必须保存的任何内容。

虽然我确定出了点问题,但 CoreData 肯定不应该在基本的多对多和正确的逆设置的情况下进入这种状态?是 Swift 的问题吗?我错过了什么?

【问题讨论】:

【参考方案1】:

在核心数据中,除了关系类型(一对一、多对多等),还可以设置删除规则。比如如果有这样的关系

A --->B(一对一)

B --->> A(一对多)

您可以设置删除规则,即删除 A 时 B 的实例会发生什么。

这篇on ***的帖子详细讨论了删除规则。

【讨论】:

虽然这两种关系都是“无效”,所以在删除项目的情况下,它应该从标签的项目关系中删除该项目吗?

以上是关于删除 NSManagedObject 子类不会取消它的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

NSManagedObject 子类问题

当一对多相关的 NSManagedObject 子类发生更改时,如何更新 NSManagedObject 子类?

NSManagedObject 和类别/子类

在 Core Data 中获取和更新,或者创建和删除 NSManagedObject?

如何在核心数据 NSManagedObject 关系的 NSSet 中添加或删除项目时触发通知?

NSManagedObject - NSSet 被删除?