readful/lib/services/database_service.dart
ddshi bef0de5909 feat: 完成文件导入功能和Book模型扩展
## 新增功能
- EPUB文件导入功能:支持文件选择、解析和存储
- 文件重复检测:避免重复导入同一文件
- 导入状态反馈:成功/失败消息提示

## 模型扩展
- Book模型新增多作者支持(authors字段)
- 新增章节数统计(chapterCount字段)
- 新增语言标识(language字段)
- 新增EPUB标识符(identifier字段)
- 优化TypeAdapter序列化支持

## 服务优化
- 新增EpubParserService:EPUB文件解析服务
- 改进DatabaseService:错误处理和数据迁移
- 优化BookRepository:调试日志和错误追踪

## 依赖更新
- 新增epubx ^4.0.0:EPUB电子书解析库
- 更新pubspec.lock:同步依赖版本

## UI改进
- AppHeader组件集成完整导入功能
- SafeArea适配:避免系统状态栏重叠
- 优化测试数据结构

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-04 20:34:16 +08:00

118 lines
3.9 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:hive_flutter/hive_flutter.dart';
import 'package:path_provider/path_provider.dart';
import '../models/book.dart';
import '../models/bookshelf.dart';
import '../models/bookmark.dart';
import '../models/highlight.dart';
///单例模式,让整个应用只有一个数据库
class DatabaseService {
static DatabaseService? _instance;
static DatabaseService get instance => _instance ??= DatabaseService._();
DatabaseService._();
late Box<Book> _booksBox;
late Box<Bookshelf> _bookshelvesBox;
late Box<Bookmark> _bookmarksBox;
late Box<Highlight> _highlightsBox;
Future<void> init() async {
try {
// 1. 获取应用文档目录
final appDocumentDir = await getApplicationDocumentsDirectory();
print('📁 应用文档目录: ${appDocumentDir.path}');
// 2. 初始化Hive
await Hive.initFlutter(appDocumentDir.path);
print('✅ Hive初始化完成');
// 3. 注册枚举TypeAdapter使用内置的枚举适配器
Hive.registerAdapter(BookFormatAdapter());
Hive.registerAdapter(ReadingStatusAdapter());
Hive.registerAdapter(BookshelfTypeAdapter());
Hive.registerAdapter(HighlightColorAdapter());
Hive.registerAdapter(AnnotationTypeAdapter());
print('✅ 枚举TypeAdapter注册完成');
// 4. 注册模型TypeAdapter
Hive.registerAdapter(BookAdapter());
Hive.registerAdapter(BookshelfAdapter());
Hive.registerAdapter(BookmarkAdapter());
Hive.registerAdapter(HighlightAdapter());
print('✅ 模型TypeAdapter注册完成');
// 5. 打开Box如果存在数据不兼容强制清空
try {
_booksBox = await Hive.openBox<Book>('books');
_bookshelvesBox = await Hive.openBox<Bookshelf>('bookshelves');
_bookmarksBox = await Hive.openBox<Bookmark>('bookmarks');
_highlightsBox = await Hive.openBox<Highlight>('highlights');
} catch (e) {
print('⚠️ Box打开失败尝试清空数据: $e');
await Hive.deleteBoxFromDisk('books');
await Hive.deleteBoxFromDisk('bookshelves');
await Hive.deleteBoxFromDisk('bookmarks');
await Hive.deleteBoxFromDisk('highlights');
// 重新打开空的Box
_booksBox = await Hive.openBox<Book>('books');
_bookshelvesBox = await Hive.openBox<Bookshelf>('bookshelves');
_bookmarksBox = await Hive.openBox<Bookmark>('bookmarks');
_highlightsBox = await Hive.openBox<Highlight>('highlights');
print('✅ 数据库清空并重新创建成功');
}
print('✅ 所有Box打开成功');
print('📚 当前书籍数量: ${_booksBox.length}');
print('✅ Hive数据库初始化成功');
} catch (e) {
print('❌ Hive数据库初始化失败: $e');
print('❌ 错误堆栈: ${StackTrace.current}');
rethrow; // 重新抛出异常,让调用者知道初始化失败
}
}
// 获取Book Box的方法
Box<Book> getBooksBox() {
if (!Hive.isBoxOpen('books')) {
throw Exception('Book Box未打开请先调用init()');
}
return _booksBox;
}
// 获取Bookshelf Box的方法
Box<Bookshelf> getBookshelvesBox() {
if (!Hive.isBoxOpen('bookshelves')) {
throw Exception('Bookshelf Box未打开请先调用init()');
}
return _bookshelvesBox;
}
/// 获取Bookmark Box的方法
Box<Bookmark> getBookmarksBox() {
if (!Hive.isBoxOpen('bookmarks')) {
throw Exception('Bookmark Box未打开请先调用init()');
}
return _bookmarksBox;
}
/// 获取Highlight Box的方法
Box<Highlight> getHighlightsBox() {
if (!Hive.isBoxOpen('highlights')) {
throw Exception('Highlight Box未打开请先调用init()');
}
return _highlightsBox;
}
/// 关闭数据库
Future<void> close() async {
await _booksBox.close();
await _bookshelvesBox.close();
await _bookmarksBox.close();
await _highlightsBox.close();
await Hive.close();
}
}