## 🎯 里程碑完成:数据层架构建设 ### ✅ 数据持久化实现 - 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>
174 lines
4.1 KiB
Dart
174 lines
4.1 KiB
Dart
// GENERATED CODE - DO NOT MODIFY BY HAND
|
|
|
|
part of 'book.dart';
|
|
|
|
// **************************************************************************
|
|
// TypeAdapterGenerator
|
|
// **************************************************************************
|
|
|
|
class BookAdapter extends TypeAdapter<Book> {
|
|
@override
|
|
final int typeId = 2;
|
|
|
|
@override
|
|
Book read(BinaryReader reader) {
|
|
final numOfFields = reader.readByte();
|
|
final fields = <int, dynamic>{
|
|
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
|
|
};
|
|
return Book(
|
|
id: fields[0] as String,
|
|
title: fields[1] as String,
|
|
author: fields[2] as String?,
|
|
publisher: fields[3] as String?,
|
|
description: fields[4] as String?,
|
|
coverImagePath: fields[5] as String?,
|
|
filePath: fields[6] as String,
|
|
format: fields[7] as BookFormat,
|
|
fileSize: fields[8] as int,
|
|
addedDate: fields[9] as DateTime,
|
|
status: fields[10] as ReadingStatus,
|
|
rating: fields[11] as double?,
|
|
tags: (fields[12] as List).cast<String>(),
|
|
totalPages: fields[13] as int,
|
|
);
|
|
}
|
|
|
|
@override
|
|
void write(BinaryWriter writer, Book obj) {
|
|
writer
|
|
..writeByte(14)
|
|
..writeByte(0)
|
|
..write(obj.id)
|
|
..writeByte(1)
|
|
..write(obj.title)
|
|
..writeByte(2)
|
|
..write(obj.author)
|
|
..writeByte(3)
|
|
..write(obj.publisher)
|
|
..writeByte(4)
|
|
..write(obj.description)
|
|
..writeByte(5)
|
|
..write(obj.coverImagePath)
|
|
..writeByte(6)
|
|
..write(obj.filePath)
|
|
..writeByte(7)
|
|
..write(obj.format)
|
|
..writeByte(8)
|
|
..write(obj.fileSize)
|
|
..writeByte(9)
|
|
..write(obj.addedDate)
|
|
..writeByte(10)
|
|
..write(obj.status)
|
|
..writeByte(11)
|
|
..write(obj.rating)
|
|
..writeByte(12)
|
|
..write(obj.tags)
|
|
..writeByte(13)
|
|
..write(obj.totalPages);
|
|
}
|
|
|
|
@override
|
|
int get hashCode => typeId.hashCode;
|
|
|
|
@override
|
|
bool operator ==(Object other) =>
|
|
identical(this, other) ||
|
|
other is BookAdapter &&
|
|
runtimeType == other.runtimeType &&
|
|
typeId == other.typeId;
|
|
}
|
|
|
|
class BookFormatAdapter extends TypeAdapter<BookFormat> {
|
|
@override
|
|
final int typeId = 0;
|
|
|
|
@override
|
|
BookFormat read(BinaryReader reader) {
|
|
switch (reader.readByte()) {
|
|
case 0:
|
|
return BookFormat.epub;
|
|
case 1:
|
|
return BookFormat.mobi;
|
|
case 2:
|
|
return BookFormat.txt;
|
|
case 3:
|
|
return BookFormat.pdf;
|
|
default:
|
|
return BookFormat.epub;
|
|
}
|
|
}
|
|
|
|
@override
|
|
void write(BinaryWriter writer, BookFormat obj) {
|
|
switch (obj) {
|
|
case BookFormat.epub:
|
|
writer.writeByte(0);
|
|
break;
|
|
case BookFormat.mobi:
|
|
writer.writeByte(1);
|
|
break;
|
|
case BookFormat.txt:
|
|
writer.writeByte(2);
|
|
break;
|
|
case BookFormat.pdf:
|
|
writer.writeByte(3);
|
|
break;
|
|
}
|
|
}
|
|
|
|
@override
|
|
int get hashCode => typeId.hashCode;
|
|
|
|
@override
|
|
bool operator ==(Object other) =>
|
|
identical(this, other) ||
|
|
other is BookFormatAdapter &&
|
|
runtimeType == other.runtimeType &&
|
|
typeId == other.typeId;
|
|
}
|
|
|
|
class ReadingStatusAdapter extends TypeAdapter<ReadingStatus> {
|
|
@override
|
|
final int typeId = 1;
|
|
|
|
@override
|
|
ReadingStatus read(BinaryReader reader) {
|
|
switch (reader.readByte()) {
|
|
case 0:
|
|
return ReadingStatus.reading;
|
|
case 1:
|
|
return ReadingStatus.completed;
|
|
case 2:
|
|
return ReadingStatus.pending;
|
|
default:
|
|
return ReadingStatus.reading;
|
|
}
|
|
}
|
|
|
|
@override
|
|
void write(BinaryWriter writer, ReadingStatus obj) {
|
|
switch (obj) {
|
|
case ReadingStatus.reading:
|
|
writer.writeByte(0);
|
|
break;
|
|
case ReadingStatus.completed:
|
|
writer.writeByte(1);
|
|
break;
|
|
case ReadingStatus.pending:
|
|
writer.writeByte(2);
|
|
break;
|
|
}
|
|
}
|
|
|
|
@override
|
|
int get hashCode => typeId.hashCode;
|
|
|
|
@override
|
|
bool operator ==(Object other) =>
|
|
identical(this, other) ||
|
|
other is ReadingStatusAdapter &&
|
|
runtimeType == other.runtimeType &&
|
|
typeId == other.typeId;
|
|
}
|