首页 / 资讯中心 / 文章详情

KOReader阅读数据管道:SimpleUI如何把SQLite阅读记录解析成阅读连击与热力图

KOReader阅读数据管道:SimpleUI如何把SQLite阅读记录解析成阅读连击与热力图 ★ FEATURED ARTICLE
【免费下载链接】simpleui.kopluginA highly customizable UI plugin for KOReader that features a home screen, bottom navigation bar, top bar and desktop modules/widgets.项目地址https://gitcode.com/gh_mirrors/si/simpleui.koplugin点击查看免费下载SimpleUIsimpleui.koplugin是一个功能强大的 KOReader 阅读插件它为阅读统计建立了一条完整的数据管道直接读取 SQLite 数据库 statistics.sqlite3 中的page_stat翻页统计记录经过 SQL 聚合、按日缓存和连击推算最终渲染出首页阅读统计卡片、连续阅读天数Streak 连击、GitHub 风格阅读热力图与「星期几 × 小时」时段网格。本文带你从数据源一路读到渲染层看看这条管道是如何运转的。数据源头statistics.sqlite3 里的 page_stat一切数据都来自 KOReader 自带的阅读统计数据库statistics.sqlite3位于 KOReader 设置目录其中的page_stat视图记录了每一次翻页id_book、page、start_timeUnix 时间戳和duration阅读秒数。SimpleUI 通过 infra/sui_config.lua 中的Config.openStatsDB()以只读方式打开该数据库。这里有几个关键设计只读、绝不写入——插件从不动 KOReader 自己的统计表连「冻结日」也保存在 SimpleUI 自己的设置里infra/sui_streak.luapage_stat是视图、无法建索引插件直接查询其底表page_stat_data利用start_time上的索引把每次扫描限定在所需时间窗内若 Statistics 云端同步正在进行openStatsDB()会返回 nil 优雅降级而不是卡死界面统计中枢module_stats_provider 的 3 次查询modules/module_stats_provider.lua 是整条管道的核心它用最少的数据库往返取回首页所有数字一次冷缓存调用只需 3 条 SQL查询作用覆盖窗口查询 1a按日分桶用 CASE WHEN 一次算出今日 / 本周 / 近 7 天 / 本月近约一个月查询 1b简单 SUM 求和本年度 历史总计查询 2取近期活跃日列表交给连击算法自适应回溯几个值得注意的细节页面去重页数按DISTINCT page || || id_book计数同一天重复读某页只算一次周 vs 滚动 7 天「本周」以周一为界「近 7 天均值」则是真正的滚动窗口两者互不干扰按日缓存结果以「YYYY-MM-DD」为键缓存跨过午夜自动失效无需额外刷新逻辑跨进程快照最近一次结果还会镜像到磁盘modules/module_stats_provider.lua冷启动首页第一帧就不至于显示暂无数据阅读连击从日期列表到 Streak 推算连击Streak的计算被单独抽成纯函数位于 infra/sui_streak.lua 的computeCurrentDayStreak()。它的输入只是一份活跃日期列表输出是从今天或昨天往回数、连续有多少天有阅读自适应窗口查询先从最近 90 天开始取DISTINCT date(start_time)如果连击恰好延伸到窗口边缘就把窗口翻倍重试直到连击在窗口内部自然结束modules/module_stats_provider.lua冻结日合并Streak Manager 的「冻结」机制允许你消耗一次冻结来补上昨天的一天断档。冻结日期在推算前合并进活跃日集合全程不写回数据库奖励规则每累计阅读 500 分钟、或连击每达到 5 的倍数各奖励 1 次冻结infra/sui_streak.lua这套设计让首页卡片和「阅读洞察」窗口共享同一份推算逻辑——修一个 bug 只需改一处。热力图数据层两条 SQL 聚合engines/sui_heatmap_data.lua 是热力图专用的数据层只认数字和时间戳不含任何 UI 代码每日数据getDailyReadingData()按id_book/page/day分组后再按天汇总避免重复阅读把时间重复计入返回「日期 → 秒数」的映射时段数据getWeekdayHourReadingData()把阅读时间落到「星期几 × 小时」的 7×24 格子里帮你发现自己是晨型还是夜猫子读者历史分页getWeekBlockRange()把时间轴切成 N 周一个的区块配合getEarliestStartTime()取最早一条记录计算最多能往回翻多少页每日级缓存MAX(start_time)廉价探测没有新阅读就完全跳过重新查询渲染层把秒数变成像素数据变成格子的过程在 engines/sui_heatmap_widgets.lua 中两个纯函数把数据表转成 KOReader 控件同一套构建器同时服务于首页卡片modules/module_heatmap.lua和全屏弹层screens/sui_heatmap_popup.lua日历热力图GitHub 贡献图风格——每格一天、周一开始排周、列顶标月份默认展示 24 周时段热力图7 行周一到周日× 24 列小时的网格一眼看出你的阅读高峰时段五级着色每个格子与整个数据集中最忙的那一天/小时对比按 25% 分位划入 0–4 级灰度没读过的格子保持纯白而非浅灰全屏弹层固定以 26 周为一块可以用箭头翻回更早的历史区块阅读洞察窗口screens/sui_stats_windows.lua则在此基础上提供逐年月度图表与当年/最佳连击统计。管道全景一次刷新发生了什么把上面各环节串起来你在首页看到的每个数字背后是这样一条链路读Config.openStatsDB()只读打开 statistics.sqlite3聚合3 条或 2 条索引友好的 SQL 完成分桶、去重、求和推算日期列表交给computeCurrentDayStreak()纯函数得出连击缓存按日缓存 磁盘快照让重复渲染零成本激励累计时长与连击长度触发冻结奖励写入 SimpleUI 自己的设置画数据层 → 着色分级 → 控件构建秒数最终变成深浅不一的格子整个管道保持了严格的职责分离——数据库访问、日期运算、连击逻辑、UI 绘制各占一个文件——这也是它能以极低开销常驻首页的原因。如果你想深入某一层可以从 modules/module_stats_provider.lua 的注释开始读起每条 SQL 的作用都有详细批注。赞分享【免费下载链接】simpleui.kopluginA highly customizable UI plugin for KOReader that features a home screen, bottom navigation bar, top bar and desktop modules/widgets.项目地址https://gitcode.com/gh_mirrors/si/simpleui.koplugin点击查看免费下载相关推荐Librum阅读统计报告生成个性化阅读数据分析Librum阅读统计报告生成个性化阅读数据分析 你是否曾想过自己一年读了多少本书哪类书籍占据阅读时间最多Librum虽然尚未提供完整的统计功能但通过其内桌面应用跨平台Genesis World 机器人仿真平台从零构建物理AI应用的终极指南Genesis World 机器人仿真平台从零构建物理AI应用的终极指南 你是否曾为机器人仿真开发的复杂性而头疼面对繁琐的物理引擎配置、渲染管线集成和性能优物理引擎具身智能机器人人工智能告别阅读困扰开源阅读鸿蒙版如何重塑你的数字阅读体验告别阅读困扰开源阅读鸿蒙版如何重塑你的数字阅读体验 你是否遇到过这样的情况想读的小说分散在不同平台每个App都要注册登录精心整理的书单在更换设备时丢失创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站