SwiftData 关系

SwiftData relationships

提问人:lmag 提问时间:11/15/2023 最后编辑:HangarRashlmag 更新时间:11/22/2023 访问量:85

问:

这个问题的第二次尝试,希望这个问题会比第一次更清楚一些。

我正在设计一个离线优先的应用程序,它需要在设备上本地下载并保存一组数据,对其进行更新,然后将其同步回 Web 服务器。

我的系统有 30 多个表,每个表与其他表有几个关系。在我之前的尝试中,我的同步系统为正在使用的表识别了要在每一端(本地和 Web 服务)同步的记录,并仅发送所需的记录。这些关系是使用键维护的,因此在从本地数据库获取记录时会自动“创建”。

SwiftData 为此带来了另一种策略,因为该框架“自动”管理相关对象之间的关系。如果我们以这段代码为例:

final class Student {
    let nameFirst: String
    let nameLast: String
    var school: School?
}

final class School {
    let name: String
    @Relationship(.inverse: \Student.school)
    var students: [Student]
}

在我以前的设计中,我的同步系统将分别获取每个表,找到需要更新的每条记录并下载它们。数据传输是最小的,从数据库管理的角度来看,这似乎是有道理的,因为每次下载保留的数据只是被修改的数据(在记录级别)。

使用 SwiftData,我似乎需要填充所有相关数据以及需要更新的数据片段。例如,如果需要从 Web 服务再次下载学生记录,我还需要下载学校记录以维持这种关系,这意味着如果我要下载学校所有学生的列表,我将多次下载相同的学校记录。

虽然如上所示,它现在可能会在小规模下产生很大的影响,但我的实际系统有更多信息,如果我需要下载记录及其相关记录进行每次更新,我可以看到数据使用量急剧上升。

我已经进行了几次测试,看起来我可以在不破坏关系的情况下更新父记录。使用我上面的例子,看起来可以在不失去关系的情况下对 School 进行更新插入。

如果不重新下载完整的家长学校记录以对其进行更新,我似乎无法更新学生。如果我只是省略它,它会删除 SQLite 数据库中的外键,并且我失去了两者之间的关联。

我认为它给我留下了两个选择:

  1. 下载重复数据以保持数据完整性,同时尝试将其最小化。

  2. 在需要时或下载后在设备上重建关系。

我错过了什么吗?

SWIFT 同步 SWIFT-DATA

评论


答: 暂无答案