该技能面向 React Native/Expo 应用,提供一套围绕 expo-sqlite 的持久化与迁移规范及配套模板。核心目标是让应用数据集中在一个 SQLite 文件中,通过同步打开、仓储层访问、冻结的向前迁移和夹具回放测试来保证一致性和可恢复性。
用途:新增表、列或持久化数据;从 AsyncStorage 迁移到 SQLite;修复升级或启动后数据丢失;为已有数据库建立版本化迁移;在 iOS 和 Android 上验证写入路径与启动路径。
主要能力:
- 数据层隔离:SQLite 与 SqlDriver 仅在 src/data/ 中导入,SQL 仅出现在 sqlite-<area>-repository.ts 及打开路径相关文件中;功能层通过仓储访问数据,不直接接触驱动。
- 同步打开与 PRAGMA:打开时先读 user_version,再设置 journal_mode=WAL、synchronous=FULL、foreign_keys=ON;所有表使用 STRICT。
- 迁移规则:每个版本对应一个 vNNNN-<name>.ts,含字面 SQL,按顺序注册,步骤与 user_version 更新在同一事务;无回退步骤,已发布步骤不得修改;删除或重命名表的步骤需标记 rebuildsTables: true。
- 快照与备份:迁移前使用 VACUUM INTO 生成 <file>.v<from>.bak,失败时复用,成功后保留最新两份。
- 夹具回放:每个已发布版本有冻结的夹具数据库和校验和,在 node:sqlite 上回放,确保全新安装与升级后 schema 和行数据一致。
- 仓储边界:方法返回 Result<T, F>,输入用 valibot 校验,值以参数绑定,SQLite 错误统一转换,读取行按 schema 校验,无法解析的行跳过并记录。
- 事务:多语句写入或循环写入使用单个事务,禁止嵌套事务。
- 重置:重置语句逐条列出,不触碰受保护表(如 entitlements、error_log),在一个事务中执行。
- 启动与检查点:在根布局首次渲染时同步打开,不在导入时写;应用进入后台时执行 wal_checkpoint(TRUNCATE)。
- 测试与验证:使用 node:sqlite 测试真实 SQL,并通过 iOS/Android 杀进程测试和 check-persistence.mjs 脚本验证。
- 可选保存文档:用于小型应用状态,严格 schema 校验、双槽位写入、损坏行隔离等。
使用方式:按工作流读取 references/ 下的参考文档;安装 expo-sqlite、expo-file-system、valibot 等依赖;复制 templates/src/data/、templates/test/sqlite/、templates/src/services/、templates/src/core/ 和 contracts/ 模板;替换示例表与仓储;在根布局中调用 openDeviceData、useCheckpointOnBackground 和 AppDataProvider;运行 jest 与 typecheck;执行杀进程测试和 check-persistence 脚本。
适用场景:需要可靠本地持久化的 Expo 应用、已有数据库需要版本化迁移、从 AsyncStorage 迁移、需要可测试的 SQL 数据层。
限制:强依赖 expo-sqlite 与特定目录结构;已发布迁移不可修改;杀进程测试需要真机 Release 构建;部分高级能力(如保存文档)需按附录配置;具体收费、平台支持范围等资料未提供。