readful/lib/services/database_service.dart
ddshi fa09de7560 feat: 完成Hive数据库数据持久化集成
## 🎯 里程碑完成:数据层架构建设

###  数据持久化实现
- Hive数据库完整集成 - 依赖配置、初始化、TypeAdapter注册
- BookRepository数据访问层 - 完整CRUD操作实现
- 自动代码生成 - build_runner + hive_generator集成
- 数据持久化验证 - 应用启动时自动测试所有功能

### 🏗️ 架构组件
- DatabaseService - 单例模式数据库管理服务
- BookRepository - Repository模式数据访问抽象层
- TypeAdapter - 自动生成对象序列化适配器
- 错误处理机制 - 完善的异常捕获和日志记录

### 📊 代码成果
- 新增2个服务类文件 (database_service.dart, book_repository.dart)
- 自动生成1个TypeAdapter文件 (book.g.dart)
- 更新4个数据模型文件 (添加Hive注解)
- 完善main.dart集成测试验证
- 新增1篇Hive详细教程文档 (06_Hive数据库数据持久化详解.md)

### 🧪 测试验证
- 数据库初始化测试 
- CRUD操作完整测试 
- 数据持久化验证 
- TypeAdapter序列化测试 
- 错误处理机制测试 

### 📚 文档完善
- 更新项目主文档 (CLAUDE.md) - 完整进度和成果统计
- 更新学习阶段总结 (05_数据模型设计阶段总结.md)
- 新增Hive使用详解 (06_Hive数据库数据持久化详解.md)
- 详细的代码示例和最佳实践指南

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

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-25 16:06:39 +08:00

51 lines
1.4 KiB
Dart
Raw 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';
class DatabaseService {
static DatabaseService? _instance;
static DatabaseService get instance => _instance ??= DatabaseService._();
DatabaseService._();
late Box<Book> _booksBox;
Future<void> init() async {
try {
// 1. 获取应用文档目录
final appDocumentDir = await getApplicationDocumentsDirectory();
// 2. 初始化Hive
await Hive.initFlutter(appDocumentDir.path);
// 3. 注册枚举TypeAdapter使用内置的枚举适配器
Hive.registerAdapter(BookFormatAdapter());
Hive.registerAdapter(ReadingStatusAdapter());
// 4. 注册Book TypeAdapter
Hive.registerAdapter(BookAdapter());
// 5. 打开Book Box
_booksBox = await Hive.openBox<Book>('books');
print('✅ Hive数据库初始化成功');
} catch (e) {
print('❌ Hive数据库初始化失败: $e');
rethrow; // 重新抛出异常,让调用者知道初始化失败
}
}
// 获取Book Box的方法
Box<Book> getBooksBox() {
if (!Hive.isBoxOpen('books')) {
throw Exception('Book Box未打开请先调用init()');
}
return _booksBox; // 添加这行返回语句
}
/// 关闭数据库
Future<void> close() async {
await _booksBox.close();
await Hive.close();
}
}