温馨提示:本文最后更新于
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
暂无评论内容