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(); // 2. 初始化Hive await Hive.initFlutter(appDocumentDir.path); // 3. 注册枚举TypeAdapter(使用内置的枚举适配器) Hive.registerAdapter(BookFormatAdapter()); Hive.registerAdapter(ReadingStatusAdapter()); Hive.registerAdapter(BookshelfTypeAdapter()); Hive.registerAdapter(HighlightColorAdapter()); Hive.registerAdapter(AnnotationTypeAdapter()); // 4. 注册模型TypeAdapter Hive.registerAdapter(BookAdapter()); Hive.registerAdapter(BookshelfAdapter()); Hive.registerAdapter(BookmarkAdapter()); Hive.registerAdapter(HighlightAdapter()); // 5. 打开Box _booksBox = await Hive.openBox('books'); _bookshelvesBox = await Hive.openBox('bookshelves'); _bookmarksBox = await Hive.openBox('bookmarks'); _highlightsBox = await Hive.openBox('highlights'); print('✅ Hive数据库初始化成功'); } catch (e) { print('❌ Hive数据库初始化失败: $e'); 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(); } }