Core Data 在重新分配时删除对象

Posted

技术标签:

【中文标题】Core Data 在重新分配时删除对象【英文标题】:Core Data delete object on reassignment 【发布时间】:2019-04-29 17:40:03 【问题描述】:

在 Core Data 中,是否可以在重新分配时自动删除对象?

例如,如果我有

class Person: NSManagedObject 
  @NSManaged public var name: String?
  @NSManaged public var group: Group?


class Group: NSManagedObject 
  @NSManaged public var people: Set<Person>?

并将新集合分配给组的people 属性:

group.people = [some new set of <Person>]`

然后保存当前上下文。我希望删除上一组中所有以前的 Person 对象。 我必须在新分配之前手动调用删除它们还是有其他方法可以做到这一点?

【问题讨论】:

【参考方案1】:

正如 cmets 中所解释的,事实证明 Cascade 删除规则不会删除组的人员,除非您删除组。所以我已经删除了我的答案并替换为这个。

如果您不想删除组,则必须删除每个人将其从关系中删除。不过还不错……

if let people = group.people 
    for person in people 
        if let person = person as? NSManagedObject 
            managedObjectContext.delete(person)
        
    

group.mutableSetValue(forKey: "people").removeAllObjects()

如果您使用谓词配置 NSBatchDeleteRequest 以仅过滤相关组中的人员,NSBatchDeleteRequest 也可能有效,但除非您有数千个要删除的人员,否则我不会打扰它。

【讨论】:

谢谢杰瑞!我在这里设置了一个示例项目:github.com/nambatee/CoreDataDeleteOnReassignment。我从 7 人的 1 个组开始,然后尝试为该组的 people 组 (github.com/nambatee/CoreDataDeleteOnReassignment/blob/master/…) 分配不同的组。旧集合中的对象仍然存在,但它们的 group 变为 nil。我按照您的建议将删除规则设置为Cascade。我错过了什么?我正在运行该项目,点击“替换”按钮并中断ViewController 中的断言。 好吧,在尝试了您的演示并使用了我自己的一个更简单的演示之后,我确信 Cascade 删除规则不会从存储中删除对象在将他们从他们的关系中删除时。我什至尝试使用可变集合访问器...group.mutableSetValue(forKey:"people").removeAllObjects(),并在托管对象上下文中调用.processPendingChanges,但孤儿学生仍然留在存储和托管对象上下文中。

以上是关于Core Data 在重新分配时删除对象的主要内容,如果未能解决你的问题,请参考以下文章

当我删除相关对象时,为啥 Core Data 会复活已删除的对象?

从 Core Data 中删除对象和切换视图控制器时崩溃

当应用程序从 4.0 中的任务列表中删除时,Core Data 存储消失

全局标识符? - iCloud + Core Data + Ensembles - 删除对象时重复

Core Data 在更新时应用删除规则

Core Data 对象删除使应用程序崩溃