Files
iOS/逐课课纲/部门课07_习惯印章簿与轻量持久化.md
T

128 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 部门课 07:习惯印章簿与轻量持久化
## 教学目标
- 区分 `@State` 临时状态和跨 App 启动保留的持久化数据。
- 知道不同形态的数据适合不同保存方式,而不是所有内容都使用同一种工具。
- 理解 `@AppStorage` 适合少量、简单、非敏感的设置或偏好。
- 认识 `@AppStorage` 中存储标识、默认值、当前值和界面 Binding 的关系。
- 认识 SwiftData 中 `@Model`、`ModelContainer`、`ModelContext` 和 `@Query` 的基本职责。
- 区分尚未确认的 `@State` 输入草稿和已经插入 SwiftData 的持久记录。
- 能追踪以下两条数据流:
```text
简单设置
→ @AppStorage
→ App 重启后恢复
```
```text
输入备注
→ 创建 HabitStamp
→ ModelContext 插入并保存
→ @Query 取得记录
→ List 更新
→ App 重启后恢复
```
- 知道 SwiftData 模型具有可供列表区分的持久身份,本节不要求手动建立 UUID。
- 能通过彻底终止并重新启动同一个 App,判断数据是否真正保存。
## 教学内容
授课干部使用“喝水印章簿基础版”作为课堂 Demo,学员课后完成同源的“我的习惯印章簿”。
Demo 包含:
- 一个由 `@AppStorage` 保存的习惯名称;
- 一个由 `@State` 保存的印章备注草稿;
- `HabitStamp` SwiftData 模型,包含简短备注和创建时间;
- 一个盖章按钮;
- 使用 `@Query` 展示的印章数量和记录列表;
- App 重新启动后的数据恢复。
课堂按以下方向讲解:
1. 先使用临时状态保存习惯名称,重新运行后观察数据消失。
2. 改用 `@AppStorage`,认识存储标识和默认值,再次验证跨启动恢复。
3. 说明单一设置与多条记录的区别,引出 SwiftData。
4. 定义包含备注和创建时间的 `HabitStamp` 模型。
5. 为 App 配置相应的模型存储容器。
6. 从 SwiftUI 环境取得 `ModelContext`,使用 `@Query` 取得已有印章。
7. 使用 `@State` 保存尚未确认的备注草稿。
8. 点击按钮后检查空内容、创建印章、插入 context,并清空草稿。
9. 观察 `@Query` 和 `List` 如何随新记录更新。
10. 彻底结束并重新启动同一个 App,确认习惯名称和多条印章记录均被恢复。
本节采用授课干部 Demo 讲解型:
- 授课干部提前完成基础版并通过 Build/Run。
- 课堂实际敲写和解释关键数据链路。
- 保留完成版作为现场演示失败时的备用。
- 学员主要观察、预测、追踪数据和讨论,不要求同步跟抄。
- 学员课后参考 Demo、步骤资料或 AI 完成同源作品。
共同内容只使用 SwiftData 的新增和读取能力,不扩展为完整 CRUD。本节不讲:
- 编辑、删除、撤销和复杂表单;
- 查询筛选、排序原理和关系模型;
- 多个习惯、每日唯一打卡、连续天数和漏签判断;
- 提醒通知、日历、统计图和云同步;
- Schema 迁移、数据库底层原理和架构分层;
- 直接操作 `UserDefaults`、Codable 文件或 Keychain;
- 敏感信息保存。
`@AppStorage` 基于 `UserDefaults`,适合简单的非敏感设置;SwiftData 通过模型、容器、上下文和查询管理结构化记录。后续细化备课时可参考 Apple 的 [AppStorage](https://developer.apple.com/documentation/swiftui/appstorage)、[UserDefaults](https://developer.apple.com/documentation/foundation/userdefaults) 和 [SwiftData 跨启动保存](https://developer.apple.com/documentation/swiftdata/preserving-your-apps-model-data-across-launches)。
## 课后作业
作业方向为“我的习惯印章簿”。具体题目、项目目录、分支、Commit、PR 标题和提交期限以后写入独立的课后作业文档。
### 最低完成标准
- 项目能够 Build/Run。
- 选择一个轻松、非敏感的习惯主题。
- 使用 `@AppStorage` 保存习惯名称,并提供合理默认值。
- 定义包含简短备注和创建时间的 SwiftData 印章模型。
- 正确配置模型容器,并使用 `ModelContext` 插入记录。
- 使用 `@State` 保存尚未提交的备注草稿。
- 空备注不能生成印章。
- 成功盖章后清空输入框。
- 使用 `@Query` 读取记录,并显示印章数量和记录列表。
- 能在一次运行中连续加入多枚印章。
- 彻底结束并重新启动 App 后,习惯名称和已有印章仍然存在。
- 至少完成一处主题文字、图标或配色修改。
达到最低标准即可视为完成,不要求视觉精致度、额外模型或完整数据管理功能。
### 建议完成标准
鼓励选择一项或多项探索:
- 增加空印章簿提示。
- 调整日期的显示形式。
- 让最新印章优先显示。
- 自定义印章图标、颜色或卡片样式。
- 增加第二个由 `@AppStorage` 保存的简单偏好。
- 尝试删除单条印章或清空全部印章,并考虑是否需要确认。
- 使用 AI 解释局部代码、排查错误或完成一处小改造,再自行运行验证。
建议内容不影响基础作业通过,不要求发展成完整习惯管理 App。
## 验收方式
- 学员通过个人 Fork 和本周作业分支,向部门公开仓库提交完整项目源码 PR。
- 本节需要证明跨启动恢复,可通过约定渠道发送简短运行视频,展示修改习惯名称、添加印章、彻底结束 App、重新启动后数据仍然存在。
- 授课干部也可以取得 PR 源码,在自己的模拟器中完成同样验证。
- 下节课可选择少量作品轻量复习,可以现场运行,也可以围绕以下问题交流:
- 哪个值由 `@AppStorage` 保存;
- 哪些内容仍然只是 `@State`;
- `@Model`、容器、context 和 query 分别承担什么作用;
- 为什么重新启动后记录仍然存在。
- 回答不完整用于发现共同问题和安排复习,不用于排名或淘汰。
- 未完成时允许提交 Draft PR,说明当前状态、完整错误和已经尝试的步骤。
验收只判断最低完成标准。建议完成内容不影响基础作业通过,课纲不规定视频编码、文件格式、大小、完整命令或其他操作细节。
源码提交、工具故障时的参与记录和隐私边界按[共同安排](../iOS部2026十课初步规划.md)执行;具体材料与操作细节由授课干部在备课阶段准备。