关系最大最小约束

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

SwiftData 的 @Relationship 宏允许我们指定一对多或多对多连接中应存在的最小和最大对象数量。

超出这些限制时,SwiftData 的自动保存将静默失败,可能导致数据丢失,除非及时进行纠正。

例如,我们可以定义一个老师模型和一个学生模型,并使用 @Relationship设置规则,规定每位老师最多可以有6名学生。以下是代码示例:

@Model class Teacher {
    var name: String
    @Relationship(maximumModelCount: 6) var students: [Student] = []
    init(name: String, students: [Student] = []) {
        self.name = name
        self.students = students
    }
}

@Model class Student {
    var name: String
    var teacher: Teacher?
    init(name: String, teacher: Teacher? = nil) {
        self.name = name
        self.teacher = teacher
    }
}

在这里,验证工作由 @Relationship(maximumModelCount: 6) 属性完成,这明确规定了数组中最多只能有6个项目。

你可以通过以下代码看到这种验证的实际效果,以及可能导致的问题:

func create() {
    let tchr = Teacher(name: "王老师")

    let student1 = Student(name: "小华")
    let student2 = Student(name: "小丽")
    let student3 = Student(name: "小强")
    let student4 = Student(name: "小杰")
    let student5 = Student(name: "小芳")
    let student6 = Student(name: "小刚")

    modelContext.insert(student1)
    modelContext.insert(student2)
    modelContext.insert(student3)
    modelContext.insert(student4)
    modelContext.insert(student5)

    tchr.students = [student1, student2, student3, student4, student5]

    let student7 = Student(name: "小燕")
    modelContext.insert(student7)
    tchr.students.append(student7)
    print(tchr.students.count)
}

这段代码创建了一位老师,并给他们6个学生,但后续又添加了一只第7个学生,这违反了关系规则,导致SwiftData 的自动保存失败。因为我们一次性添加所有学生,SwiftData 无法安全保存。因此,如果要遵循规则,建议先创建 5个学生的老师,再逐步添加。

如果你尝试自己运行一个保存操作,可以更清楚地看到这个问题—把这段代码添加到方法的末尾:

do {
    try modelContext.save()
} catch {
    print(error.localizedDescription)
}

现在你会看到消息 Too many items in %{PROPERTY}@ 被打印出来,这意味着我们违反了关系规则。

所以,如果你想使用最小和最大计数,请小心使用!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容