flutter - 如何在 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>[])
解决方案
如果您说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.id
和B.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的对象来获取Bs
类A
实例的所有内容。这是通过带有注释的 a 在幕后完成的。Bs
A
ToMany<>
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>;
}
推荐阅读
- dart - 如何在 Flutter 上将宽度设置为 Material 小部件?
- java - 无法使用 OSGi 将 JavaFX 添加到 Maven 项目
- firebase - 将相对图像转换为 base64 或使用您的相对图像使用节点上传到 Firebase 存储
- sql - 用于字符串 stringtokenizer 的 Oracle 函数
- matlab - 声压降低一定 dB
- c# - 只要其中任何一个完成,就使用异步调用的结果(具有不同的返回类型)?
- python-3.x - 计算由另一个元素分组的 JSON 元素中项目的出现次数
- sql - 如何将 Excel 文件导入 Microsoft Access 2013
- python - 如何使用 boto3 获取 S3 存储桶中的顶级文件夹?
- python - 如何优化数字排列以提高效率