diff --git a/app/src/main/assets/updateLog.md b/app/src/main/assets/updateLog.md index 3e030372a9..79f29e6549 100644 --- a/app/src/main/assets/updateLog.md +++ b/app/src/main/assets/updateLog.md @@ -1,8 +1,6 @@ -# 更新日志 -欢迎关注公众号[阅读Plus]即时了解软件更新资讯 - - -## cronet版本: 128.0.6613.40 +**2026/08/15** +- feat(sync): 同步间隔支持即时/5/10/30分钟 +- 间隔档位改为 即时(0)/5/10/30 分钟,默认 5 分钟 **2026/07/15** - 新增导出链接为口令、自动识别口令导入 diff --git a/plan-V1.md b/plan-V1.md deleted file mode 100644 index 578b3f8deb..0000000000 --- a/plan-V1.md +++ /dev/null @@ -1,188 +0,0 @@ -# legado-E 多端增量同步 — 实施规划 V1 - -**版本**:V1(规划稿) -**日期**:2026-08-14 -**对应需求文档**:`需求文档.md`(阅读Sigma 增量同步) - ---- - -## 0. 结论摘要 - -- **范围**:核心子集先行 —— 书架(books)、书签(bookmarks)、分组(book_groups)、阅读记录(readRecord)、阅读设置文件(ReadBookConfig/ThemeConfig)。 -- **云端**:每条记录一个 JSON 文件,`PROPFIND` 的 `getlastmodified` 作为天然索引。 -- **删除**:SQLite `AFTER DELETE` 触发器写墓碑表,推送墓碑文件。 -- **调度**:新增 WorkManager 依赖做周期同步。 - ---- - -## 1. 总体架构 - -``` -┌─ 触发源 ──────────────────────────────┐ -│ App启动pull / 生命周期onStop push │ -│ WorkManager周期任务 / 手动"立即同步" │ -└──────────────┬────────────────────────┘ - ▼ - SyncManager (object, Mutex串行) - ├─ ChangeCollector:扫描 dirty行 + 墓碑 - ├─ ConflictDetector:比对时间戳 - ├─ SyncClient:Push/Pull 记录及文件 - └─ SyncLedger:状态记录(LocalConfig共享参数) - │ - WebDav库(复用 AppWebDav 鉴权) - ▼ - legado/sync/books|bookmarks|bookGroups|readConfigs|readRecords|settings|tombstones/ -``` - -## 2. 数据层改造(Room 89 → 90) - -新增 `migration_89_90`(手动 Migration,`DatabaseMigrations.kt`): - -```sql -ALTER TABLE books ADD local_modified INTEGER NOT NULL DEFAULT 0 -ALTER TABLE books ADD cloud_modified INTEGER NOT NULL DEFAULT 0 -ALTER TABLE bookmarks ADD local_modified INTEGER NOT NULL DEFAULT 0 -ALTER TABLE bookmarks ADD cloud_modified INTEGER NOT NULL DEFAULT 0 -ALTER TABLE book_groups ADD local_modified INTEGER NOT NULL DEFAULT 0 -ALTER TABLE book_groups ADD cloud_modified INTEGER NOT NULL DEFAULT 0 -ALTER TABLE readRecord ADD local_modified INTEGER NOT NULL DEFAULT 0 -ALTER TABLE readRecord ADD cloud_modified INTEGER NOT NULL DEFAULT 0 - -CREATE TABLE sync_tombstones ( - tableName TEXT NOT NULL, recordKey TEXT NOT NULL, - deletedAt INTEGER NOT NULL DEFAULT 0, - PRIMARY KEY(tableName, recordKey)) -``` - -实体类同步加字段(`Book.kt`、`Bookmark.kt`、`BookGroup.kt`、`ReadRecord.kt`,`@ColumnInfo(defaultValue="0")`)。`AppDatabase.kt` 版本号 `89→90`,`migrations` 数组加入 `migration_89_90`;旧 `backup.zip` 恢复路径不变(旧 JSON 无该字段,GSON 默认填 0)。 - -**全局同步台账**:不建 Room 表,用 `LocalConfig`(SharedPreferences)存 `lastPullByType`、`lastPushTime`——与现有 `LocalConfig.lastBackup` 模式一致、无额外 DAO。`sync_metadata` 表作为备选方案写入计划备注。 - -## 3. 变更检测(触发器) - -在 `migration_89_90` 中为四张表创建触发器,`local_modified` 条件式打点,天然兼容"同步写入"与"用户写入": - -```sql -CREATE TRIGGER trg_books_up AFTER UPDATE ON books -WHEN NEW.local_modified = OLD.local_modified -BEGIN - UPDATE books SET local_modified = NEW.modified_now -- 即当前毫秒 - WHERE bookUrl = NEW.bookUrl; -END; -``` - -- **用户写入**:DAO 写入时 `local_modified` 保持 0/原值 → 触发器打 `now`。 -- **同步拉取**:SyncClient 应用云端数据后用 `markSynced(key, cloudModified)` 一次性回写 `local_modified = cloud_modified`(≠旧值,触发器跳过,不会回环)。 -- **删除**:`AFTER DELETE` 触发器把 `(tableName, recordKey)` 写入 `sync_tombstones`;同步引擎应用远端删除前先删除本地墓碑同键记录,避免循环墓碑。 -- INSERT 同理(`AFTER INSERT ... WHEN NEW.local_modified = 0`)。 - -> 若实现期发现触发器 `WHEN` 条件跨表取 `now` 有局限,退化为"在关键写入点显式盖章",实施时用 grep 定位所有 `bookDao.delete/insert/update` 与 `bookmarkDao.*` 调用点(已确认约 12~15 处,如 `BookmarkDialog.kt:63,71`、`BookshelfManageViewModel.kt:57`、`Book.kt:439`)。 - -## 4. 云端布局(每条记录一个文件) - -`legado//sync/` 下按类型分子目录,文件名取自稳定主键(`sha1(bookUrl)`、bookmark 的 `time` 主键等): - -``` -sync/books/.json { modified, data:{...Book} } -sync/bookmarks/