【问题标题】:Core Data delete object on reassignmentCore Data 在重新分配时删除对象
【发布时间】: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 对象。 我必须在新分配之前手动调用删除它们还是有其他方法可以做到这一点?

【问题讨论】:

    标签: core-data


    【解决方案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,但孤儿学生仍然留在存储和托管对象上下文中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多