SwiftData、Core Data 与数据模型
对象持久化框架负责模型和保存,但不替你决定业务约束、迁移和冲突策略。
用你的前端经验理解
可以借用 ORM 的思路理解,但它不是直接把 Prisma 语法搬进 App;数据上下文与 UI 查询有专门的生命周期。
为什么需要它
数据库框架不仅帮你保存数组,还维护对象身份、查询、关系与变更。SwiftData 适合与 SwiftUI 紧密结合的模型持久化;Core Data 拥有成熟的历史与更广泛既有项目。选择前应确认最低系统版本、迁移、复杂查询以及同步需求,而不是看到 @Model 就认定所有数据都该直接放进视图。
它是怎样工作的
ModelContainer 组织模型存储,ModelContext 负责读取和跟踪变更;保存可能失败,自动保存也不表示任意时刻都已经落盘。模型关系需要定义删除规则,界面中的一个对象引用也不适合随意跨隔离域共享。结构演进应使用明确版本和迁移计划,不能在开发时靠卸载 App 代替真实升级路径。
把关键概念连起来
SwiftData
用 @Model 描述持久化模型,ModelContainer 管理存储,ModelContext 负责操作,@Query 可驱动 SwiftUI 展示。
Core Data
成熟的对象图管理与持久化方案,常见于已有项目。新项目按最低系统版本和能力需求选择。
演进
模型修改可能需要迁移;删除关系、唯一性、错误恢复和测试都应明确。SwiftData 从 iOS 17、macOS 14 等起可用。
import SwiftData@Modelfinal class ReadingItem { var title: String var isRead: Bool = false init(title: String) { self.title = title }}- @Model 声明持久化模型的结构,不会独立创建整个存储系统;应用还需配置容器并从合适上下文读写。
- 保存、关系删除与旧数据迁移都在模型声明之外,不能仅凭这一段类型定义认定持久化已经完成。
用于理解当前概念的代码片段;部分示例需要放入对应工程与作用域,并补齐上下文。
给文章增加标签关系
- 先定义 Article 与 Tag 的关系,并决定删除文章是否只移除关联,而不删除其他文章仍使用的标签。
- 插入记录并在关键动作后处理保存结果。关闭并重开 App,验证数据来自磁盘而非原来的内存实例。
- 下一版增加字段时准备旧版本数据,执行升级读取,确认默认值、关系与查询仍正确。
这里需要你亲自判断
自动保存不是“无需处理保存失败”;也不要把持久化模型随意跨 Actor 传递。
做一个小练习
为阅读清单设计 title、URL、createdAt、isRead,明确哪些可空以及删除行为。
- 用内存存储做预览或测试,用磁盘存储验证重启恢复。
- 建立两篇文章共享一个标签,删除其中一篇后检查另一篇关系。
展开参考思路与验收标准
模型、上下文和磁盘有不同职责。删除一篇文章不应误删共享标签;迁移验证必须从旧数据开始,新装空库通过不代表升级安全。