级联关系删除

温馨提示:本文最后更新于2025-01-19 09:40:09,某些文章具有时效性,若有错误或已失效,请在下方留言

SwiftData 默认的关系删除规则是.nullify,这意味着如果一个 School 对象与多个 Student对象关联,删除 School 后,学生对象仍会保留在数据存储中。在某些情况下这是合理的,但你也可以使用.cascade 删除规则,这会在父对象删除时,删除所有相关的子对象。

如果你有多层级的关系并使用级联删除规则,SwiftData 会一直删除所有相关对象,直到最底层。

在处理级联删除时,有两种方法。最简单、最明智的方法是手动指定逆向关系,这样可以将关系的一方设为非可选类型,代码如下:

@Model class School {
    var name: String
    @Relationship(deleteRule: .cascade, inverse: \Student.school) var students: [Student]
    init(name: String, students: [Student]) {
        self.students = students
    }
}

@Model class Student {
    var school: School
    var name: String
    init(school: School, name: String) {
        self.school = school
        self.name = name
    }
} 

如果你想让 SwiftData 自动推断逆向关系,可以省略关系中的 inverse 参数,并将另一方的属性设为可选类型,代码如下:

@Model class School {
    var name: String
    @Relationship(deleteRule: .cascade) var students: [Student]
    init(name: String, students: [Student]) {
        self.students = students
    }
}

@Model class Student {
    var school: School?
    var name: String
    init(school: School?, name: String) {
        self.school = school
        self.name = name
    }
}

请记住,级联删除 意味着多层级关系会自动沿链条依次删除。例如,如果我们有一个学校包含许多学生,每个学生又有多个考试成绩,并为这些关系设置了级联删除规则,那么删除学校时,所有学生及其考试成绩都会被一并删除。

下面是在 Swift 中的写法:

@Model class School {
    var name: String
    @Relationship(deleteRule: .cascade, inverse: \Student.school) var students: [Student]

    init(name: String, students: [Student] = []) {
        self.name = name
        self.students = students
    }
}

@Model class Student {
    var name: String
    var school: School
    @Relationship(deleteRule: .cascade) var results: [Result]

    init(name: String, school: School, results: [Result] = []) {
        self.name = name
        self.school = school
        self.results = results
    }
}

@Model class Result {
    var subject: String
    var grade: Int

    init(subject: String, grade: Int) {
        self.subject = subject
        self.grade = grade
    }
}
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容