关于 sqlite-data
这是一份使用 SQLiteData 在 Swift 中构建类型安全 SQLite 数据层的技能指南,涵盖表模型、查询、写入、迁移、SwiftUI 集成和 CloudKit 同步模式。
主要功能
- 01通过 Swift 宏定义类型安全表模型
- 02Fetch 包装器与查询模式
- 03事务写入与数据库迁移
- 04SwiftUI 和 UIKit 集成指南
- 05CloudKit 同步与测试参考
适用场景
- 01为 Swift 应用建模 SQLite 表
- 02添加查询和事务式数据库写入
- 03通过迁移规划数据库结构变更
- 04将数据库数据接入 SwiftUI 视图
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ johnrogers/ claude-swift-engineering --skill sqlite-data安装后在 Claude Code 中输入/sqlite-data确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/advanced-optimization.mdadvanced-queries.mdcloudkit.mddependencies.mdmigrations.mdmodels.mdqueries-advanced.mdqueries-basics.mdschema-composition.mdtesting.mdviews-integration.mdviews-swiftui.mdwrites.md详细介绍
SQLite Data
SQLiteData 通过 Swift 宏提供类型安全的 SQLite 访问,简化数据库建模和查询,同时自动处理 CloudKit 同步、迁移和异步模式。
参考资料加载指南
只要有哪怕一丝可能需要用到相关内容,就务必加载参考文件。 有上下文总比遗漏模式或出错好。
| 参考资料 | 何时加载 |
|---|---|
| 表模型 | 使用 @Table 定义表、设置主键、列或枚举时 |
| 查询 - 基础 | 使用 @FetchAll、@FetchOne、@Selection、筛选、排序或连接时 |
| 查询 - 高级 | 使用 FetchKeyRequest 搭配 @Fetch、动态查询、递归 CTE 或直接读取时 |
| 写入 | 插入、更新、插入或更新记录、删除记录或管理事务时 |
| 视图 - SwiftUI | 在 SwiftUI 视图中使用 @FetchAll/@FetchOne、@Observable 模型或动画时 |
| 视图 - 集成 | 集成 UIKit、动态加载查询、集成 TCA 或使用 observe {} 时 |
| 迁移 | 使用 DatabaseMigrator 或 #sql() 宏创建数据库迁移时 |
| CloudKit 同步 | 设置 CloudKit 私有数据库同步、共享或同步代理时 |
| 依赖项 | 通过 @Dependency 注入数据库/同步引擎、设置引导模式或集成 TCA 时 |
| 测试 | 设置测试数据库、填充数据或为 SQLite 代码编写断言时 |
| 高级 - 查询 | 实现触发器、自定义数据库函数或全文搜索(FTS5)时 |
| 高级 - 优化 | 调优性能、使用索引、自定义聚合、JSON 聚合或自连接时 |
| 架构组合 | 使用 @Selection 列组、单表继承或数据库视图时 |
核心工作流
使用 SQLiteData 时:
- 使用
@Table宏定义表模型 - 在视图或
@Observable模型中使用@FetchAll/@FetchOne属性包装器 - 通过
@Dependency(\.defaultDatabase)访问数据库 - 在
database.write { }事务中执行写入 - 首次使用前设置迁移
常见错误
-
N+1 查询模式 — 在循环中逐条加载记录(例如,先获取用户,再单独获取该用户的所有帖子)会严重影响性能。请改用连接或批量获取。
-
架构变更时缺少迁移 — 修改
@Table却不创建迁移,会导致运行时崩溃。部署前,务必为架构变更创建迁移。 -
事务处理不当 — 在
database.write { }代码块之外运行耗时事务,可能导致死锁或数据丢失。请保持写入代码块简短且专注。 -
忽略 CloudKit 同步代理 — 设置 CloudKit 同步却不实现
SyncDelegate,意味着你将无法处理错误和解决冲突。生产环境中请实现所有代理方法。 -
在 SwiftUI 视图中过度获取 — 使用
@FetchAll却不筛选或限制,可能会加载数千条记录,导致界面卡顿。请使用谓词、限制和排序,以减少内存占用。
评论
支持 Markdown