首页 > 解决方案 > 如何在 ObjectBox 中存储标准组合类?

问题描述

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

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

我把@Entint y 注释放在上面BasicInfo class,生成模型后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, 2073579066569957521),
        name: 'id',
        type: 6,
        flags: 1)
  ],
  relations: <ModelRelation>[],
  backlinks: <ModelBacklink>[])

在此处输入图像描述

标签: flutterdartobjectbox

解决方案


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

class A {
  List<B> bs;
}

class B {
  List<C> cs;
}

class C {}

为了在 ObjectBox 中使用它,您可以将它们定义为关系,可以是独立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在您的情况下,relation 可以实现相同的效果,并且 relatin 信息实际上作为单个 ID 存储在对象本身上,即有一个隐藏int B.classAId字段,您可以通过查找指向 this的对象来获取BsA实例的所有内容。这是通过带有注释的 a 在幕后完成的。BsAToMany<>Backlink()

@Entity()
class A {
  int id;

  @Backlink()
  final bs = ToMany<B>();
}

@Entity()
class B {
  int id;
 
  final a = ToOne<A>; 

  @Backlink()
  final cs = ToMany<C>;
}

@Entity()
class C {
  int id;

  final b = ToOne<B>; 
}

推荐阅读