Hive 错误未知类型 TimeStamp 。您是不是忘记注册适配器。如何为外部包中使用的对象类型生成 TypeAdapter?
Posted
技术标签:
【中文标题】Hive 错误未知类型 TimeStamp 。您是不是忘记注册适配器。如何为外部包中使用的对象类型生成 TypeAdapter?【英文标题】:Hive Error unknown type TimeStamp . did you forget to register an adapter. How to generate TypeAdapter for object type used in external Packages?Hive 错误未知类型 TimeStamp 。您是否忘记注册适配器。如何为外部包中使用的对象类型生成 TypeAdapter? 【发布时间】:2020-12-18 08:08:28 【问题描述】:我的 Flutter 应用使用 Hive 进行本地数据管理,使用 Firebase 进行云数据存储。
我有一个使用 Firebase 包中的 Timestamp 和 FieldValue 的模式。我还创建了 TypeAdapter 并在主类中为我的自定义模式注册了它。
在执行应用程序时,Hive 会抛出以下错误:
未处理的异常:hive 错误:无法写入,未知类型: 时间戳。您忘记注册适配器了吗?
问题:
如何为 Firebase 包的 Timestamp 和 FieldValue 等内置对象类型创建 TypeAdapter(存在于类中:loud_firestore.dart
)?
包装:
dependencies:
hive: ^1.4.4
dev_dependencies:
hive_generator: ^0.7.1
build_runner:
示例代码:
主类:
Hive.registerAdapter(SampleModalAdapter());
模式代码:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:hive/hive.dart';
part 'samplemodal.g.dart';
@HiveType(typeId: 1)
class SampleModal
@HiveField(0)
String id;
@HiveField(1)
String title;
@HiveField(2)
Timestamp dateTime;
@HiveField(3)
FieldValue serverDateTime;
SampleModal(
this.id,
this.title,
this.dateTime,
this.serverDateTime,
);
生成的 TypeAdapter 代码:
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'samplemodal.dart';
// **************************************************************************
// TypeAdapterGenerator
// **************************************************************************
class SampleModalAdapter extends TypeAdapter<SampleModal>
@override
final int typeId = 1;
@override
SampleModal read(BinaryReader reader)
final numOfFields = reader.readByte();
final fields = <int, dynamic>
for (int i = 0; i < numOfFields; i++) reader.readByte(): reader.read(),
;
return SampleModal(
id: fields[0] as String,
title: fields[1] as String,
dateTime: fields[2] as Timestamp,
serverDateTime: fields[3] as FieldValue,
);
@override
void write(BinaryWriter writer, SampleModal obj)
writer
..writeByte(4)
..writeByte(0)
..write(obj.id)
..writeByte(1)
..write(obj.title)
..writeByte(2)
..write(obj.dateTime)
..writeByte(3)
..write(obj.serverDateTime);
@override
int get hashCode => typeId.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is SampleModalAdapter &&
runtimeType == other.runtimeType &&
typeId == other.typeId;
【问题讨论】:
【参考方案1】:基于 hive 文档,“hive 仅支持原语、列表和映射,还支持您喜欢的任何 Dart 对象”。因此,在您的情况下,请尝试将保存方式更改为 hive,例如先将其转换为 int 毫秒。
【讨论】:
【参考方案2】:对于任何回到这里的人,请将其写入扩展名为“.g.dart”的文件中:
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:hive/hive.dart';
class TimestampAdapter extends TypeAdapter<Timestamp>
@override
final typeId = 16;
@override
Timestamp read(BinaryReader reader)
final micros = reader.readInt();
return Timestamp.fromMicrosecondsSinceEpoch(micros);
@override
void write(BinaryWriter writer, Timestamp obj)
writer.writeInt(obj.microsecondsSinceEpoch);
【讨论】:
您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。以上是关于Hive 错误未知类型 TimeStamp 。您是不是忘记注册适配器。如何为外部包中使用的对象类型生成 TypeAdapter?的主要内容,如果未能解决你的问题,请参考以下文章
用于 UDF 的 Hive DATE 和 TIMESTAMP 的正确数据类型
Hive中的Timestamp类型日期与Impala中显示不一致分析
如何使用 unix_timestamp 和 from_unixtime Hive 函数将数据类型更改为时间戳
HIVE UDF:RuntimeException 内部错误:找不到未知的 ObjectInspector