LESSON 24 / 577 分钟

SwiftData、Core Data 与数据模型

对象持久化框架负责模型和保存,但不替你决定业务约束、迁移和冲突策略。

用你的前端经验理解

可以借用 ORM 的思路理解,但它不是直接把 Prisma 语法搬进 App;数据上下文与 UI 查询有专门的生命周期。

为什么需要它

数据库框架不仅帮你保存数组,还维护对象身份、查询、关系与变更。SwiftData 适合与 SwiftUI 紧密结合的模型持久化;Core Data 拥有成熟的历史与更广泛既有项目。选择前应确认最低系统版本、迁移、复杂查询以及同步需求,而不是看到 @Model 就认定所有数据都该直接放进视图。

它是怎样工作的

ModelContainer 组织模型存储,ModelContext 负责读取和跟踪变更;保存可能失败,自动保存也不表示任意时刻都已经落盘。模型关系需要定义删除规则,界面中的一个对象引用也不适合随意跨隔离域共享。结构演进应使用明确版本和迁移计划,不能在开发时靠卸载 App 代替真实升级路径。

把关键概念连起来

1

SwiftData

用 @Model 描述持久化模型,ModelContainer 管理存储,ModelContext 负责操作,@Query 可驱动 SwiftUI 展示。

2

Core Data

成熟的对象图管理与持久化方案,常见于已有项目。新项目按最低系统版本和能力需求选择。

3

演进

模型修改可能需要迁移;删除关系、唯一性、错误恢复和测试都应明确。SwiftData 从 iOS 17、macOS 14 等起可用。

Swift · 示例片段
import SwiftData@Modelfinal class ReadingItem {    var title: String    var isRead: Bool = false    init(title: String) { self.title = title }}
  • @Model 声明持久化模型的结构,不会独立创建整个存储系统;应用还需配置容器并从合适上下文读写。
  • 保存、关系删除与旧数据迁移都在模型声明之外,不能仅凭这一段类型定义认定持久化已经完成。

用于理解当前概念的代码片段;部分示例需要放入对应工程与作用域,并补齐上下文。

给文章增加标签关系

  1. 先定义 Article 与 Tag 的关系,并决定删除文章是否只移除关联,而不删除其他文章仍使用的标签。
  2. 插入记录并在关键动作后处理保存结果。关闭并重开 App,验证数据来自磁盘而非原来的内存实例。
  3. 下一版增加字段时准备旧版本数据,执行升级读取,确认默认值、关系与查询仍正确。

这里需要你亲自判断

自动保存不是“无需处理保存失败”;也不要把持久化模型随意跨 Actor 传递。

做一个小练习

为阅读清单设计 title、URL、createdAt、isRead,明确哪些可空以及删除行为。

  1. 用内存存储做预览或测试,用磁盘存储验证重启恢复。
  2. 建立两篇文章共享一个标签,删除其中一篇后检查另一篇关系。
展开参考思路与验收标准

模型、上下文和磁盘有不同职责。删除一篇文章不应误删共享标签;迁移验证必须从旧数据开始,新装空库通过不代表升级安全。

ModelContainer 的主要职责是什么?

继续查阅官方资料
Apple Developer 官方资料

本课聚焦核心认知。具体 API、系统要求与发布政策,以当前官方文档和工程验证为准。

答对理解题后即可标记完成