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 包的 TimestampFieldValue 等内置对象类型创建 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

Hive date/timestamp/date_sub/date_add/date_format/日期时间格式转换

Hive date/timestamp/date_sub/date_add/date_format/日期时间格式转换