大多数桌面应用都要面对「怎么存文档」这个问题。常见的答案是自己设计一套文件格式,或者塞一个 JSON。但还有一个被低估的选项:直接用 SQLite 当文件格式——一个文档就是一个 .db 文件。
自定义格式的隐藏成本
自己发明格式,等于要自己实现:增量写入、崩溃恢复、版本迁移、部分读取。这些每一项都是坑,而且是那种上线后才会暴露的坑。SQLite 已经把它们全解决了,而且经过了二十年的实战检验。
事务就是「保存」
用数据库当文档,最舒服的一点是保存变成了一个事务。要么整份写成功,要么回滚——不会再出现「保存到一半断电、文件损坏」的经典惨剧。
BEGIN;
UPDATE doc SET body = ? WHERE id = 1;
INSERT INTO history(ts, snapshot) VALUES (?, ?);
COMMIT;
顺手你还白得了一套历史记录:每次保存往 history 表插一行,撤销/重做几乎是免费的。
什么时候别用
它不是银弹。如果文档需要被人直接用文本编辑器打开、需要在 Git 里做有意义的 diff、或者要和其他工具用纯文本互操作,那 SQLite 的二进制外壳就成了障碍。这类场景,老老实实用文本格式。
选文件格式,本质是在「人类可读」和「机器可靠」之间选一边。
但对于那些只由你的程序读写、且看重可靠性的文档——笔记软件、设计工具、游戏存档——把 SQLite 当文件格式,往往是那个让你少踩无数坑的答案。