import '../database_helper.dart'; /// EPUB 阅读器数据访问层 class ReaderDao { final DatabaseHelper _db = DatabaseHelper.instance; // ─── reader_books ───────────────────────────────────────────────── /// 获取所有未删除的阅读记录 Future>> getAllReaderBooks() async { final db = await _db.database; return db.query( 'reader_books', where: 'is_deleted = 0', orderBy: 'updated_at DESC', ); } /// 根据 ID 获取阅读记录 Future?> getReaderBookById(String id) async { final db = await _db.database; final results = await db.query( 'reader_books', where: 'id = ?', whereArgs: [id], limit: 1, ); return results.isNotEmpty ? results.first : null; } /// 插入阅读记录 Future insertReaderBook(Map book) async { final db = await _db.database; return db.insert('reader_books', book); } /// 更新阅读记录字段 Future updateReaderBook(String id, Map fields) async { final db = await _db.database; return db.update( 'reader_books', fields, where: 'id = ?', whereArgs: [id], ); } /// 更新阅读进度 Future updateReadingProgress( String id, String cfi, double percentage) async { final db = await _db.database; return db.update( 'reader_books', { 'last_read_cfi': cfi, 'reading_percentage': percentage, 'updated_at': DateTime.now().toIso8601String(), }, where: 'id = ?', whereArgs: [id], ); } /// 软删除 Future deleteReaderBook(String id) async { final db = await _db.database; return db.update( 'reader_books', {'is_deleted': 1, 'updated_at': DateTime.now().toIso8601String()}, where: 'id = ?', whereArgs: [id], ); } // ─── 关联 books 表 ───────────────────────────────────────────── /// 关联 EPUB 到 books 表中的书籍 Future linkToBook(String readerBookId, String bookId) async { final db = await _db.database; return db.update( 'reader_books', {'book_id': bookId, 'updated_at': DateTime.now().toIso8601String()}, where: 'id = ?', whereArgs: [readerBookId], ); } /// 取消关联 Future unlinkBook(String readerBookId) async { final db = await _db.database; return db.update( 'reader_books', {'book_id': '', 'updated_at': DateTime.now().toIso8601String()}, where: 'id = ?', whereArgs: [readerBookId], ); } /// 通过 books.id 查找关联的 reader_book Future?> getReaderBookByBookId(String bookId) async { final db = await _db.database; final results = await db.query( 'reader_books', where: 'book_id = ? AND is_deleted = 0', whereArgs: [bookId], limit: 1, ); return results.isNotEmpty ? results.first : null; } // ─── book_annotations ───────────────────────────────────────────── /// 获取某本书的所有批注 Future>> getAnnotationsByBookId( String bookId) async { final db = await _db.database; return db.query( 'book_annotations', where: 'book_id = ?', whereArgs: [bookId], orderBy: 'created_at DESC', ); } /// 插入批注 Future insertAnnotation(Map annotation) async { final db = await _db.database; return db.insert('book_annotations', annotation); } /// 删除批注 Future deleteAnnotation(int id) async { final db = await _db.database; return db.delete('book_annotations', where: 'id = ?', whereArgs: [id]); } // ─── bookmarks ────────────────────────────────────────────────── /// 获取某本书的所有书签 Future>> getBookmarksByBookId(String bookId) async { final db = await _db.database; return db.query( 'book_annotations', where: 'book_id = ? AND type = ?', whereArgs: [bookId, 'bookmark'], orderBy: 'created_at DESC', ); } /// 插入书签 Future insertBookmark(Map bookmark) async { final db = await _db.database; return db.insert('book_annotations', { ...bookmark, 'type': 'bookmark', }); } /// 删除书签 Future deleteBookmark(int id) async { final db = await _db.database; return db.delete('book_annotations', where: 'id = ?', whereArgs: [id]); } }