用途:为 Flutter 应用的设备端 Drift/SQLite 存储提供分层与一致性规范。适用场景是 lib/data/ 下的 Drift 表、DAO、repository、连接设置或备份。
主要能力与规则:package:drift 与 package:sqlite3 只能出现在 lib/data/,由禁止导入的 lint 或 grep 检查;DAO 把行映射为不可变值对象,边界外不出现 Table、Companion、TableInfo 或生成的 row 类。不变量写入 schema:表为 STRICT,枚举列加 CHECK,范围加 CHECK,关系使用显式 onDelete 的外键,唯一性用(部分)UNIQUE INDEX。每次打开连接都在 setup/beforeOpen 中设置 foreign_keys 与 synchronous,journal_mode = WAL 也幂等设置;仅在建库时(if (details.wasCreated))播种。每次变更为一个 db.transaction,内部查询都要 await,先持久化再发布,由 .watch() 流自行重发。只存规范值:金额用整数最小单位加 ISO-4217 代码、真实现时刻用 UTC epoch 毫秒、本地日历日用品数整数,不在列中存展示字符串。派生状态读取时重算,不另存一份权威。读取使用按所有者与时间窗口限定的 .watch() 流,分页用 keyset 而非 OFFSET。BLOB 字节不存 SQLite,文件存磁盘并保存相对基础目录的路径。备份用 wal_checkpoint(TRUNCATE) 加 VACUUM INTO 并重新打开验证。
使用方式:按任务阅读 references/schema-and-daos.md、references/backup-and-wal.md、references/persistence-without-drift.md;PR 前运行 scripts/check-drift-confinement.sh 与 scripts/check-persistence-bans.sh;迁移与测试见 run-migration。实现里使用 NativeDatabase FFI,不用 sqflite。
限制:schema 演进为仅向前、追加式并受快照保护,须提升 schemaVersion 并新增 stepByStep 步骤,不得修改已发布步骤;未提供具体价格、平台支持范围或性能数据。