Repository navigation
OpenFicM 0.10.2
OpenFicM 0.10.2
修复:删掉参考书后,它的参考文风没有被一起删掉
症状是文风选择器里出现多条同名参考文风,其中几条的来源写着“参考书已删除”。它们不是同一本书的 V1/V2/V3,而是失去了参考书的孤儿文风——参考书删了,文风却留在了库里。
根因在数据库层:style_profiles.source_id 声明了 ON DELETE CASCADE,但 expo-sqlite 的 withExclusiveTransactionAsync 会新开一条连接执行事务(useNewConnection: true),而 PRAGMA foreign_keys 是连接级开关、SQLite 默认为关闭,应用只在主连接上打开过它。于是独占事务里的 ON DELETE CASCADE 与 ON DELETE SET NULL 全部不生效:
| 操作 | 本应发生 | 实际发生 |
|---|---|---|
| 删除参考书 | 它的参考文风一并删除 | 文风留下成为孤儿,且界面上再也删不掉 |
| 删除章节 | 草稿删除,笔记上浮到卷 | 草稿与笔记的 chapter_id 都悬空 |
| 删除卷 | 章节删除,笔记上浮到整书 | 章节与笔记都留下 |
| 删除作品 | 卷、章节、草稿、笔记、角色、世界书、对话、向量块、作者文风全部删除 | 全部留下成为孤儿 |
本版处理这个根因带来的全部后果:
- 启动时做一次幂等的一致性修复:清掉孤儿文风、章节、草稿、笔记、角色、世界书条目、对话、消息、向量块;笔记按设计上浮(章没了归到卷、卷没了归到整书);悬空引用置空;“明确不使用文风”的哨兵值保留,不会因此重新弹出选文风询问。
- 依赖级联的删除改为显式删除,不再依赖外键开关:删参考书、删作品、删卷、删章节、删文风都在同一事务里显式处理各自的子表。
- 清理顺序为先父级、后按“父不存在”清理子级,一次启动即可收敛,不留二级孤儿。
- 设计与交接文档记录这条陷阱:独占事务里外键不生效,级联关系必须显式写出。
兼容性
- 沿用 0.7.0 起的正式签名证书,可直接覆盖升级。
- applicationId
com.openfic.mobile,versionCode 20,minSdk 28,仅 arm64-v8a。 - 升级后首次启动会清理历史孤儿数据(父记录已不存在的行);正常数据、参考文风指南文本、笔记内容、对话记录都不受影响。
- 已在 0.10.1 里加的文风选择器来源/轮次/预览提示保留,用于继续辨认同名参考文风。