如何使用Hive保存与检索Map<DateTime, List<PressureModel>>类型数据?
如何用Hive保存并检索
Map<DateTime, List<PressureModel>>类型数据 要实现这类复杂结构的存储与检索,需要针对Hive的特性做适配,以下是具体步骤:
1. 配置Hive依赖
在pubspec.yaml中添加必要依赖:
dependencies: hive: ^2.2.3 hive_flutter: ^1.1.0 dev_dependencies: hive_generator: ^1.1.5 build_runner: ^2.1.7
2. 改造PressureModel适配Hive序列化
给自定义类添加Hive注解,让Hive能识别并生成序列化适配器:
import 'package:hive/hive.dart'; @HiveType(typeId: 0) // 全局唯一的typeId,避免与其他类冲突 class PressureModel extends HiveObject { @HiveField(0) String pressure; @HiveField(1) String action; @HiveField(2) DateTime date; PressureModel({required this.pressure, this.action = '', required this.date}); }
3. 适配DateTime作为Map的Key
Hive默认不支持DateTime直接作为Map的键,需自定义适配器:
创建date_time_adapter.dart文件:
import 'package:hive/hive.dart'; class DateTimeAdapter extends TypeAdapter<DateTime> { @override final typeId = 1; // 与PressureModel的typeId不重复即可 @override DateTime read(BinaryReader reader) { return DateTime.fromMillisecondsSinceEpoch(reader.readInt()); } @override void write(BinaryWriter writer, DateTime obj) { writer.writeInt(obj.millisecondsSinceEpoch); } }
4. 初始化Hive并注册适配器
在main函数中完成Hive初始化与适配器注册:
import 'package:hive/hive.dart'; import 'package:hive_flutter/hive_flutter.dart'; import 'pressure_model.dart'; import 'date_time_adapter.dart'; void main() async { await Hive.initFlutter(); // 注册自定义适配器 Hive.registerAdapter(PressureModelAdapter()); // 后续通过build_runner生成 Hive.registerAdapter(DateTimeAdapter()); // 打开存储Map数据的Box await Hive.openBox<Map<DateTime, List<PressureModel>>>('pressures_box'); runApp(MyApp()); }
然后运行命令生成PressureModel的适配器:
flutter packages pub run build_runner build
5. 保存数据
// 获取对应的Box实例 final pressuresBox = Hive.box<Map<DateTime, List<PressureModel>>>('pressures_box'); // 保存你的Map数据 await pressuresBox.put('pressures_data', pressures);
6. 检索数据
// 从Box中读取数据,为空时返回空Map final savedPressures = pressuresBox.get('pressures_data') ?? <DateTime, List<PressureModel>>{}; // 示例:遍历数据 savedPressures.forEach((date, pressureList) { print('日期:${date.toLocal()}'); for (var model in pressureList) { print('血压:${model.pressure},记录时间:${model.date.toLocal()}'); } });
备选方案:转换DateTime为字符串存储
如果不想自定义适配器,也可以将DateTime转为ISO字符串作为Map的键:
// 保存时转换格式 final convertedMap = pressures.map((key, value) => MapEntry(key.toIso8601String(), value)); await pressuresBox.put('pressures_data', convertedMap); // 读取时还原格式 final savedConvertedMap = pressuresBox.get('pressures_data') ?? <String, List<PressureModel>>{}; final savedPressures = savedConvertedMap.map((key, value) => MapEntry(DateTime.parse(key), value));
内容的提问来源于stack exchange,提问作者Alexandr
相关产品推荐
相关产品推荐

