Files
MookNote/Wiki/Data-Access-Layer.md
DelLevin-Home ea7381d0bc 添加wiki
2026-06-03 18:42:32 +08:00

3.1 KiB
Raw Blame History

数据访问层

DAO 模式

每个实体有独立的 DAO 类,封装 SQLite CRUD 操作:

DAO 文件 实体
MovieDao lib/utils/movie/movie_dao.dart Movie
BookDao lib/utils/book/book_dao.dart Book
NoteDao lib/utils/note/note_dao.dart Note
MovieReviewDao lib/utils/movie/movie_review_dao.dart MovieReview
MoviePosterDao lib/utils/movie/movie_poster_dao.dart MoviePoster
BookReviewDao lib/utils/book/book_review_dao.dart BookReview
BookExcerptDao lib/utils/book/book_excerpt_dao.dart BookExcerpt
TagDao lib/utils/tag/tag_dao.dart Tag

DatabaseHelper

lib/utils/database_helper.dart — SQLite 数据库单例管理器。

class DatabaseHelper {
  static final DatabaseHelper instance = DatabaseHelper._init();
  static Database? _database;

  Future<Database> get database;        // 获取数据库实例(懒初始化)
  Future<void> reopenDatabase();        // 关闭并重新打开WebDAV 同步后调用)
  Future<void> close();                 // 关闭数据库
}
  • 数据库文件名:mooknote.db
  • 当前版本13
  • 初始化时执行 _createDB,版本不匹配时执行 _onUpgrade 迁移链

DAO 通用方法

MovieDao 为例:

getAllMovies()                                    // 获取所有未删除记录
getMoviesPaged({status, limit, offset})           // 分页查询
getMoviesByStatus(status)                         // 按状态筛选
getMoviesByDirector(director)                     // 按导演筛选
getMoviesByActor(actor)                           // 按演员筛选
insertMovie(movie)                                // 插入
updateMovie(movie)                                // 更新
deleteMovie(id)                                   // 软删除
getDeletedMovies()                                // 获取已删除记录
restoreMovie(id)                                  // 恢复
permanentDeleteMovie(id)                          // 彻底删除

软删除机制

所有实体使用 is_deleted 字段实现软删除:

删除操作 → UPDATE SET is_deleted = 1 WHERE id = ?
查询操作 → WHERE is_deleted = 0
恢复操作 → UPDATE SET is_deleted = 0 WHERE id = ?
彻底删除 → DELETE FROM table WHERE id = ?

回收站页面(lib/pages/recycle_bin_page.dart)展示所有 is_deleted = 1 的记录,支持恢复和彻底删除。

TagDao

标签 DAO 管理 tags 表,支持:

  • getTagsByType(type) — 获取某类型所有标签
  • addTag(name, type) — 添加标签UNIQUE 约束防重复)
  • renameTag(tagId, newName) — 重命名标签并级联更新关联条目
  • deleteTag(tagId, {replacementName}) — 删除标签,可选替换关联条目中的标签名
  • deleteTagOnly(tagId) — 仅删除标签记录,不修改关联条目
  • getTagById(tagId) — 获取单个标签

标签级联逻辑重命名或删除标签时会遍历关联实体表movies.genres / books.genres / notes.tags将旧标签名替换为新名称或移除。

返回首页