You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:35:21