如何在 ObjectBox 中存储标准组合类? 第一种选择 - 使用 ToMany第二种选择 - 使用带有反向链接的 ToOne

问题描述

我有A类包含B类列表,包含C类列表 那么我将如何在 ObjectBox 中实现这一目标?我如何存储它?

在下面的图片中你可以看到我有 BasicInfo Class 包含 Data class 等等....

我在 BasicInfo class添加@Entinty 注释,但在生成模型后 class D 没有显示objectBox.g.dart 文件,因为它属于 BasicInfo 属性

  ModelEntity(
  id: const IdUid(1,3501283007979667013),name: 'BasicInfo',lastPropertyId: const IdUid(1,2073579066569957521),flags: 0,properties: <ModelProperty>[
    ModelProperty(
        id: const IdUid(1,name: 'id',type: 6,flags: 1)
  ],relations: <ModelRelation>[],backlinks: <ModelBacklink>[])

enter image description here

解决方法

如果您说 Class A contains 一个 List of Class B,那么它们的关系不是子类/超类,而是标准组合。我知道你的定义有点像这样:

class A {
  List<B> bs;
}

class B {
  List<C> cs;
}

class C {}

为了在 ObjectBox 中使用它,您可以将它们定义为 relations,或者是独立的 ToMany 关系,或者是带有反向链接的 ToOne 关系 - 取决于更好的描述您的数据,您可以通过两者实现相同的效果。

第一种选择 - 使用 ToMany

ToMany 关系将信息存储在一个单独的 ID“表”中,例如:A.id <--> B.idB.id <--> C.id 之间的另一个。

@Entity()
class A {
  int id;
  final bs = ToMany<B>();
}

@Entity()
class B {
  int id;
  final cs = ToMany<C>;
}

@Entity()
class C {
  int id;
}

第二种选择 - 使用带有反向链接的 ToOne

ToOne 关系可以在您的情况下实现相同的效果,并且相关信息实际上作为单个 ID 存储在对象本身上,即有一个隐藏的 int B.classAId 字段,您可以获得所有 {{ 1}} 为类 Bs 实例,通过查找指向此 A 的那些 Bs。这是由带有 A 注释的 ToMany<> 在幕后完成的。

Backlink()