## 新增功能 - 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>
118 lines
3.9 KiB
Dart
118 lines
3.9 KiB
Dart
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();
|
||
}
|
||
}
|