Flutter 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<HiveDiscomfort>字段总是再次为空!但是其余的HiveVitals-字段仍然正确保存!?

我在这里错过了什么?我不明白…任何帮助都很感激!如果你还需要什么,请告诉我!

还打开了Github上的一个问题。

我使用这个方法,它对我有效,因为List不需要注册适配器:

await Hive.openBox<List>(bookmarks);

添加这样的数据:

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

您可以通过ValueListenableBuilder访问数据。

如果你说数据正在保存,一切都很好,直到你没有重新启动应用程序。所以问题可能是:在重新启动你的应用程序后,你可能会在应用程序启动后立即设置一个功能,清除Hive中保存的所有数据。检查这个。如果会出现这种情况,那么删除从配置单元DB中清除所有数据的行或函数。

更新的答案:

我以前的解决方案让我思考,我想我知道为什么嵌套列表没有持久化。看起来hive并没有检查列表是否相等,因此永远不会保留更改,而是使用当前内存中的对象。因此,这就是为什么只要应用程序运行,对象就正确地存在于内存中,但当应用程序关闭时,hive不会保存数据,因为它认为数据(此处为列表(从未更改,即使它们发生了更改(这是我现在的猜测,无需进一步研究hive包的代码(。

因此,这意味着解决方案将是在equals方法中检查列表的相等性。例如:

@override
bool operator ==(Object other) =>
identical(this, other) ||
other is HiveVitals &&
runtimeType == other.runtimeType &&
id == other.id &&
date == other.date &&
listEquals(otherDiscomfort, other.otherDiscomfort) &&
listEquals(mentalDiscomfort, other.mentalDiscomfort);

对我来说,这个解决方案是有效的。

老答案:

我也有同样的问题。。。

我试图根据这个例子来解释我的解决方案。给定一个对象HiveVitals hiveVitals = HiveVitals(),每当我试图向自定义对象(如hiveVitals.otherDiscomfort.add()(的嵌套列表中添加一些内容时,它都会被保存,但不会持久化(每当我重新启动应用程序时,它就会消失(。当我想在嵌套列表中添加一些内容时,我做了以下操作:

List<HiveDiscomfort> tempList = [...hiveVitals.otherDiscomfort];
tempList.add(newData);
hiveVitals.otherDiscomfort = tempList;

这对我很有效,现在我的数据被持久化了。

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

以下是关于数据丢失原因的几个提示:

  • 蜂巢常见问题解答:如果我的应用程序被杀会发生什么?可能发生的最糟糕的事情是如果最后一个条目写得还不完整,你就会丢失它。蜂箱具有内置的完整性检查和故障恢复功能,并负责一切
  • 限制:键必须是32位无符号整数或带最大值的ASCII字符串长度为255个字符。支持的整数值包括-2^53和2^53之间的整数,以及一些较大的整数大小对象不允许包含循环。蜂巢不会检测它们并存储将导致无限循环。只有一个进程可以随时访问一个框。否则坏事就会发生。方框作为文件存储在用户的应用程序目录中。常见违法行为字符/符号,例如/%&因此应该避免

最有可能的原因可能与Hive Relationships行为的不当实施有关。您正在使用HiveLists吗?如果不是,请仔细研究。其次,当应用程序被杀时,你可能只是想存太多钱。请尝试在终止应用程序之前更改保存操作,以验证行为是否正确。

最新更新