提问人:lmag 提问时间:11/15/2023 最后编辑:HangarRashlmag 更新时间:11/22/2023 访问量:85
SwiftData 关系
SwiftData relationships
问:
这个问题的第二次尝试,希望这个问题会比第一次更清楚一些。
我正在设计一个离线优先的应用程序,它需要在设备上本地下载并保存一组数据,对其进行更新,然后将其同步回 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 数据库中的外键,并且我失去了两者之间的关联。
我认为它给我留下了两个选择:
下载重复数据以保持数据完整性,同时尝试将其最小化。
在需要时或下载后在设备上重建关系。
我错过了什么吗?
答: 暂无答案
评论