【问题标题】:Flutter Hive save custom object with list of custom objects gone after restarting appFlutter Hive 保存自定义对象,其中自定义对象列表在重新启动应用程序后消失
【发布时间】:2022-01-01 12:19:24
【问题描述】:

我在我的项目中使用Hive- 包在本地存储一些数据。到目前为止一切正常,但现在我面临一个问题:

我有一个Custom-Class,它也有一个字段和另一个Custom-Class

part 'hive_vitals_interface.g.dart';

@HiveType(typeId: 1)
class HiveVitals extends HiveObject {
  @HiveField(0)
  String? id;
  @HiveField(1)
  DateTime? date;
  @HiveField(2)
  List<HiveDiscomfort> otherDiscomfort;
  @HiveField(3)
  List<HiveDiscomfort> mentalDiscomfort;

  HiveVitals({
    this.id,
    this.date,
    this.otherDiscomfort = const [],
    this.mentalDiscomfort = const [],
  });
}

还有我的HiveDiscomforts-Class

part 'hive_discomfort_interface.g.dart';

@HiveType(typeId: 2)
class HiveDiscomfort extends HiveObject {
  @HiveField(0)
  String? title;
  @HiveField(1)
  int? intensity;

  HiveDiscomfort({
    this.title,
    this.intensity,
  });
}

我正在尝试像这样保存 HiveVitals

  static Future<void> addVitals(HiveVitals hiveVitals) async {
    final vitalsBox = getVitalsBox();

    await vitalsBox.put(hiveVitals.date!.toIso8601String(), hiveVitals);

  }

然后像这样检索它:

  static List<HiveVitals> getVitals() {
    Box<HiveVitals> box = getVitalsBox();
    List<HiveVitals> hiveVitals = box.values.toList();
    return hiveVitals;
  }

问题:

我没有收到任何错误。事实上,当保存我的对象并在调试器中检查它时,一切都正确保存。但是,当重新启动应用程序时,我的 List&lt;HiveDiscomfort&gt; 字段总是再次为空!但是HiveVitals-Fields 的其余部分仍然正确保存!?

我在这里缺少什么?我不明白...任何帮助表示赞赏!如果您还需要什么,请告诉我!

还在 Github 上打开了issue

【问题讨论】:

    标签: flutter dart local-storage flutter-hive


    【解决方案1】:

    以下是关于可能导致数据丢失的问题的一些提示:

    • Hive 常见问题解答:如果我的应用程序被终止会怎样?可能发生的最糟糕的事情是 如果尚未完全写入,您将丢失最后一个条目。蜂巢 具有内置的完整性检查和崩溃恢复,并负责处理 一切。
    • 限制:密钥必须是 32 位无符号整数或 ASCII 字符串,最大 长度为 255 个字符。支持的整数值包括所有 -2^53 和 2^53 之间的整数,以及一些更大的整数 大小对象不允许包含循环。蜂巢不会 检测它们并存储将导致无限循环。只有一个 进程可以随时访问一个框。否则会发生坏事。 盒子作为文件存储在用户的应用程序目录中。常见违法 因此,应避免使用 /%& 等字符/符号。

    最可能的原因可能与 Hive 关系行为的不当实施有关。你在使用 HiveLists 吗?如果不是更多地查看closely。其次,当应用程序被终止时,您可能只是试图节省太多。尝试在应用被终止之前更改保存操作以验证行为是否正确。

    【讨论】:

      【解决方案2】:

      如果您说正在保存数据并且一切正常,直到您没有重新启动应用程序。所以问题可能是: 重新启动您的应用程序后,您可以放置​​一个功能,该功能会在应用程序启动后立即清除 Hive 中保存的所有数据。 检查这个。如果这样的话,那么删除从 hive 数据库中清除所有数据的行或函数。

      【讨论】:

      • 不,不是这样。问题是对象本身正在被保存。只是列表字段是空的,即使我在其中保存了对象
      【解决方案3】:

      我使用这种方法,它适用于我,因为List 不需要注册适配器:

      await Hive.openBox<List>(bookmarks);
      

      像这样添加数据:

      boxValue.put(index, [
                          question.title,
                          question.options,
                     ],
      );
      

      您可以通过ValueListenableBuilder访问数据。

      【讨论】:

      • 感谢您的回答。有了这个我可以保存自定义对象的列表,但是问题是我的自定义对象的字段在重新启动后没有保存。但所有其他字段都被正确保存
      • 我明白了,也许将这些自定义对象转换为地图可能会有用。
      【解决方案4】:

      我认为这是包的问题,​​因为我有同样的问题,一切正常,但重新启动应用程序后数据消失了。所以我在 hive flutter github 上问了这个问题,还没有答案。所以我请你在 hive flutter github 上打开一个问题,让他们知道这是我们面临的一个真正的问题。

      【讨论】:

      • 已经打开了一个问题。感谢您的帮助
      • 不客气。希望这个问题能尽快解决
      • @Chris 如有可能,请在此处添加问题以供其他人参考。
      • @PavanDittakavi 完成。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      相关资源
      最近更新 更多