ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Legado 阅读 3.0 数据层架构全解析:Room 数据库、dao 与 entities 设计

Legado 阅读 3.0 数据层架构全解析:Room 数据库、dao 与 entities 设计 移动开发前端应用【免费下载链接】legado-with-MD3使用 Material Design 3 全新设计的阅读 3.0项目地址https://gitcode.com/gh_mirrors/le/legado-with-MD3点击查看免费下载本指南以app/src/main/java/io/legado/app/data/目录为核心系统梳理 Legado阅读 3.0本地持久化层从 Room 数据库的整体布局、dao数据操作接口与entities数据模型的设计到数据库迁移与 schema 导出机制再到 Repository 层的业务封装。读完你将掌握该应用的数据表结构、实体字段语义、DAO 查询模式与迁移策略能够基于此扩展或调试书架、书源、RSS、阅读记录等核心模块。数据层目录总览app/src/main/java/io/legado/app/data/是整个应用的本地数据中枢目录结构如下对应 data 目录 的真实布局子目录 / 文件职责dao/数据操作约 40 个 Room DAO 接口负责增删改查entities/数据模型约 50 个Entity实体类与若干规则/阅读记录辅助模型local/preferences/本地偏好设置LocalPreferences.ktmodel/非持久化的数据模型如分页缓存信息、漫画页脚配置repository/业务仓储层将 DAO 封装为面向业务域的高层接口书籍、书源、RSS、AI、备份等security/敏感凭据加解密如CloudTtsCredentialCipher.ktAppDatabase.ktRoom 数据库入口版本、实体注册、DAO 注册、回调DatabaseMigrations.kt手写数据库迁移集合README.md数据层说明文档正如 README.md 所述数据层由两大支柱构成dao 数据操作与entities 数据模型。文档中列出的核心实体包括Book书籍信息、BookChapter目录信息、BookGroup书籍分组、Bookmark书签、BookSource书源、CookieHTTP Cookie、ReplaceRule替换规则、RssArticleRSS 条目、RssReadRecordRSS 阅读记录、RssSourceRSS 源、RssStarRSS 收藏、SearchBook搜索结果、SearchKeyword搜索关键字、TxtTocRuleTXT 文件目录规则。这些仅是实体全集的核心子集实际注册进数据库的实体远不止这些见下文 AppDatabase 分析。AppDatabase数据库的中央入口构建方式与连接配置数据库实例通过Room.databaseBuilder懒加载构建相关代码见 AppDatabase.ktval appDb by lazy { Room.databaseBuilder(appCtx, AppDatabase::class.java, AppDatabase.DATABASE_NAME) .fallbackToDestructiveMigrationFrom(false, 1, 2, 3, 4, 5, 6, 7, 8, 9) .addMigrations(*DatabaseMigrations.migrations) .allowMainThreadQueries() .addCallback(AppDatabase.dbCallback) .build() }关键点数据库文件名为legado.db常量DATABASE_NAME见 AppDatabase.ktfallbackToDestructiveMigrationFrom对版本 19 的极早期数据库采用重建策略而 10 及以后的版本全部走显式迁移保护用户数据allowMainThreadQueries()允许主线程查询——这对书架等高频 UI 场景的同步读取很重要但生产实践中仍应优先使用协程与 FlowonCreate时db.setLocale(Locale.CHINESE)让 SQLite 按中文排序规则处理文本。版本与注册清单Database注解见 AppDatabase.kt声明version 107当前数据库版本与app/schemas/io.legado.app.data.AppDatabase/下导出的107.json一一对应exportSchema true开启 schema 导出便于追踪每个版本的完整表结构实体注册entities数组注册了 51 个实体类覆盖书籍Book、目录BookChapter、书源BookSource、替换规则、搜索、Cookie、RSS 全系、阅读记录ReadRecord、ReadRecordDetail、ReadRecordSession、TTSHttpTTS、ReadAloudVoiceEntity、CloudTtsEngineEntity、AI 能力AiProviderProfile、AiModelProfile、AiChatConversation、AiArtifact等、标注与知识库BookMarking、BookCharacterProfile、BookKnowledgeEntry、BookOutlineNode等视图注册views [BookSourcePart::class]即书源的只读投影视图见 BookSourcePart.kt用于以轻量字段集合访问书源而不加载全量规则DAO 注册AppDatabase抽象类中声明了 43 个abstract val xxxDao属性见 AppDatabase.kt涵盖bookDao、bookSourceDao、bookChapterDao、rssSourceDao、cookieDao、replaceRuleDao、txtTocRuleDao、readRecordDao、httpTTSDao、cacheDao、dictRuleDao、serverDao、homepageModuleDao、highlightRuleDao、aiProfileDao、aiChatDao等。数据库打开时的内置分组初始化dbCallback.onOpen见 AppDatabase.kt在数据库每次打开时执行幂等 SQL向book_groups表插入内置虚拟分组where not exists保证不重复插入内置分组groupId含义全部BookGroup.IdAll-1默认显示本地BookGroup.IdLocal-2本地书籍默认隐藏音频BookGroup.IdAudio-3音频书小说BookGroup.IdText-8文本书默认隐藏漫画BookGroup.IdManga-7漫画默认隐藏在读 / 未读 / 已读 / 连载已读 / 完本已读-20 / -21 / -22 / -23 / -24按阅读状态自动归类默认隐藏网络未分组 / 本地未分组-4 / -5未分组的书默认隐藏更新失败-11抓取失败的书此外回调还会做数据修补将书源、RSS 源、HTTP TTS 中值为字符串null的loginUi置空为httpTTS补concurrentRate 0默认值并在keyboardAssists表为空时从DefaultData.keyboardAssists写入默认键盘辅助项数据来源见 defaultData 目录下的keyboardAssists.json。entities数据模型的字段语义Bookbooks 表Book见 Book.kt是书架核心表tableName books主键为bookUrl详情页 URL本地书籍时存完整文件路径并建立两个索引(name, author)与(durChapterTime)。代表性字段tocUrl目录页 URLorigin/originName书源 URL 与名称origin默认BookType.localTag表示本地书type书籍类型文本、漫画、音频等按位组合参考BookType常量group: Long所属分组用位掩码表达一本书同时属于多个分组isPrivate单本私密标记与私密分组的判定关系为“本标记 ∪ 所属私密分组”见 Book.kt 的注释该字段会随书架备份保留真正敏感凭据另有BackupConfig排除规则latestChapterTitle/latestChapterTime/lastCheckCount最新章节信息与最近一次更新检查结果durChapterTitle/durChapterIndex/durChapterPos/durChapterTime当前阅读进度——章节名、章节索引、段落内字符位置、最后阅读时间readConfig针对单本书的阅读设置覆盖ReadConfig对象variable书源规则可读写的自定义变量JSON 字符串运行时解析为variableMap。实体init块还会对kind、intro、customTag、latestChapterTitle、durChapterTitle等字段做take(...)长度截断防止脏数据撑爆 UI 与数据库见 Book.kt。BookChapterchapters 表BookChapter见 BookChapter.kt的tableName chapters采用复合主键(url, bookUrl)并定义了索引(bookUrl, index)唯一保证同一本书内章节序号不重复外键指向books.bookUrlonDelete ForeignKey.CASCADE——删除书籍时自动级联删除其全部章节源码注释明确“删除书籍时自动删除章节”字段涵盖章节地址、标题、卷标记isVolume、目录层级tocLevel、序号index、VIP/付费标记、音频真实 URLresourceUrl、章节字数、EPUB 章节的start/end字节位置与fragmentId以及段评图标reviewImg等。BookSourcebook_sources 表BookSource见 BookSource.kt是书源配置实体tableName book_sources主键bookSourceUrl索引bookSourceUrl非唯一。核心字段bookSourceName、bookSourceGroup名称与分组bookSourceType书源类型注释明确 0文本、1音频、2图片、3文件仅提供下载的站点、4视频enabled、enabledExplore是否启用、是否启用发现jsLibJS 库enabledCookieJar是否自动保存请求 CookieconcurrentRate并发率header请求头loginUrl/loginUi/loginCheckJs登录地址、登录 UI 与登录检测 JSexploreUrl/exploreScreen/ruleExplore发现规则searchUrl与搜索规则lastUpdateTime、respondTime、weight用于书源排序的元数据bookSourceComment、variableComment注释与自定义变量说明。规则类字段ruleExplore、ruleSearch、ruleBookInfo、ruleContent、ruleToc等类型为 entities/rule 下的ExploreRule、SearchRule、BookInfoRule、ContentRule、TocRule、ReviewRule通过TypeConverters(BookSource.Converters::class)将对象序列化为 JSON 存储。BookGroupbook_groups 表BookGroup见 BookGroup.kt定义用户自定义分组字段包括groupId、groupName、cover、排序order、enableRefresh、show是否显示、bookSort组内排序方式、isPrivate。其中groupId 采用位掩码约定默认0b1即 1 左移 N 位使一本书可以通过Book.group字段同时归属多个分组负的groupId为内置分组常量如IdRoot -100、IdAll -1。dao数据操作的查询模式DAO 层dao 目录是唯一与 SQL 直接打交道的层。以BookDao见 BookDao.kt为例可以看到几种典型模式按内置分组分发查询flowByGroup(groupId)将书架各分组映射到专用QueryflowRoot()、flowAll()、flowLocal()、flowAudio()、flowUnread()、flowReading()、flowReadFinished()等统一返回FlowListBook供 UI 响应式订阅并用list.filterNot { it.isNotShelf }过滤非书架条目。私密性 SQL 掩码DAO 顶部定义了常量见 BookDao.ktPRIVATE_GROUP_MASK所有私密分组的groupId位或PUBLIC_GROUP_MASK所有非私密分组的位或PUBLIC_BOOK_FILTERgroup 0或group与私密分组掩码交集为 0随后在flowRoot等查询中组合使用type text 0、($PUBLIC_GROUP_MASK group) 0、$PUBLIC_BOOK_FILTER实现“私密分组内的书籍不出现在公开书架/书籍广场”的过滤。数据类投影DAO 方法可返回非实体数据类如GroupBookCount(groupId, count)、BookShelfItem、ShelfBookSummary实现多表 JOIN 投影减少 UI 层数据组装成本。数据库迁移体系Legado 的 schema 演进由手写 Migration Room AutoMigration双轨驱动手写迁移DatabaseMigrations.migrations数组见 DatabaseMigrations.kt包含从migration_10_11到migration_102_103的若干手写迁移对象。早期迁移大量使用ALTER TABLE ADD如rssSources ADD style、book_sources ADD bookSourceComment涉及重建表时则用“建新表 →INSERT INTO ... select * from→ 删旧表 → 重命名”三步法例如 DatabaseMigrations.kt 中为books增加唯一索引index_books_name_author。版本跳号如 15→17说明历史上存在被废弃的中间版本。AutoMigrationAppDatabase注解中注册了 43→44 直至 106→107 的AutoMigration见 AppDatabase.kt其中需要自定义逻辑的版本提供spec如Migration_54_55、Migration_64_65、Migration_100_101其余依赖 Room 自动推断。部分迁移附带注释说明意图例如 101→102 新增book_marks表、103→104 为httpTTS增加可空列speed、105→106 为readRecordSession增加bookUrl归属列、106→107 为books增加isPrivate列。schema 导出app/schemas/io.legado.app.data/AppDatabase/下保存了 1.json107.json 全部历史 schema配合 Room 的迁移校验可在编译期androidTest 的 MigrationTestHelper验证迁移脚本正确性。Repository 层从 DAO 到业务域的封装在 dao/entities 之上项目在 repository 目录 维护了面向业务域的仓储层将原子查询组合为领域操作例如书籍域BookRepository、BookSourceRepository、BookGroupRepository、BookshelfRepository、LocalBookRepository、RemoteBookRepository、BookImportRepository阅读相关ReadRecordRepository、ReadSettingsRepository、ReadStyleRepository、ChapterSpeechRepository、BookContentProcessRepositoryRSS 域RssRepository、RssArticleRepository、RssFavoriteRepository、RssSourceEditRepository配置与同步SettingsRepository、ThemePackageSettingsRepository、BackupRestoreRepository、WebDavBackupRepository、WebDavReadingProgressRepository能力扩展HttpTtsEngineRepository、CloudTtsEngineRepository、AiChatRepository、AiProfileRepository、DictionaryRepositoryImpl、TranslationCacheRepositoryImpl、HighlightRuleRepository、TagGroupRuleRepository等。以BackupRestoreRepository、WebDavBackupRepository为例它们负责把books、book_sources等表导出为备份文件并在恢复时写回——数据层的表结构直接决定了备份文件的字段全集因此新增实体时往往需要同步调整备份/恢复逻辑与对应 schema 迁移。扩展数据层的实践路径若要在该仓库中新增一个业务实体例如新的统计模块依据上述架构可以总结出固定套路在 entities 中新增Entity数据类明确主键、索引、默认值与长度截断在 dao 中新增Dao接口按需返回Flow/挂起函数/数据类投影将实体与 DAO 注册进 AppDatabase.kt 的entities与抽象属性并提升Database(version ...)版本号依据变更类型加列 / 加表 / 改约束选择 AutoMigration 或手写Migration并更新 DatabaseMigrations.kt在 repository 中提供领域级 API供 UI 层调用。总结Legado 数据层是一套层次分明、迁移完备的 Room 持久化体系entities定义 50 张表的字段语义与约束dao以 Flow 和位掩码查询支撑书架分组与私密过滤DatabaseMigrations.kt与 107 份 schema 导出保障了长期演进的数据安全repository则把原子查询收敛为可复用的业务能力。理解这一层就掌握了书架、书源、RSS、阅读进度、TTS 与 AI 功能等全部模块的地基。赞分享移动开发前端应用【免费下载链接】legado-with-MD3使用 Material Design 3 全新设计的阅读 3.0项目地址https://gitcode.com/gh_mirrors/le/legado-with-MD3点击查看免费下载相关推荐Ehviewer数据层架构终极指南Room数据库与DAO设计模式深度解析Ehviewer数据层架构终极指南Room数据库与DAO设计模式深度解析 在Android应用开发中 数据层架构设计 是确保应用稳定性和可维护性的关键因素。YTDLnis数据库设计Room数据持久化架构详解YTDLnis作为一款基于yt dlp的Android音视频下载应用其强大的 数据库设计 和 Room数据持久化架构 为应用提供了稳定可靠的数据管理基础。本文移动开发音视频android-sunflower数据层揭秘Room数据库设计与实现android sunflower数据层揭秘Room数据库设计与实现 引言 在移动应用开发中数据层的设计至关重要。它负责数据的存储、检索和管理直接影响应用移动开发示例工程上一篇暗黑破坏神II存档编辑器新手快速上手指南下一篇终极暗黑破坏神2存档编辑器Diablo Edit2完全指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表