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 _booksBox; late Box _bookshelvesBox; late Box _bookmarksBox; late Box _highlightsBox; Future 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('books'); _bookshelvesBox = await Hive.openBox('bookshelves'); _bookmarksBox = await Hive.openBox('bookmarks'); _highlightsBox = await Hive.openBox('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('books'); _bookshelvesBox = await Hive.openBox('bookshelves'); _bookmarksBox = await Hive.openBox('bookmarks'); _highlightsBox = await Hive.openBox('highlights'); print('✅ 数据库清空并重新创建成功'); } print('✅ 所有Box打开成功'); print('📚 当前书籍数量: ${_booksBox.length}'); print('✅ Hive数据库初始化成功'); } catch (e) { print('❌ Hive数据库初始化失败: $e'); print('❌ 错误堆栈: ${StackTrace.current}'); rethrow; // 重新抛出异常,让调用者知道初始化失败 } } // 获取Book Box的方法 Box getBooksBox() { if (!Hive.isBoxOpen('books')) { throw Exception('Book Box未打开,请先调用init()'); } return _booksBox; } // 获取Bookshelf Box的方法 Box getBookshelvesBox() { if (!Hive.isBoxOpen('bookshelves')) { throw Exception('Bookshelf Box未打开,请先调用init()'); } return _bookshelvesBox; } /// 获取Bookmark Box的方法 Box getBookmarksBox() { if (!Hive.isBoxOpen('bookmarks')) { throw Exception('Bookmark Box未打开,请先调用init()'); } return _bookmarksBox; } /// 获取Highlight Box的方法 Box getHighlightsBox() { if (!Hive.isBoxOpen('highlights')) { throw Exception('Highlight Box未打开,请先调用init()'); } return _highlightsBox; } /// 关闭数据库 Future close() async { await _booksBox.close(); await _bookshelvesBox.close(); await _bookmarksBox.close(); await _highlightsBox.close(); await Hive.close(); } }