我想最好的(唯一的?)方法是为嵌套结构创建一个单独的框,然后创建从父(一个)到子(许多)的关系。
然而,我的问题是如何实现.toObjectBox()
方法将我的域数据模型转换为ObjectBox数据模型。从dartz包中是否有类似的Either
(返回左侧或右侧对象),同时传输2个对象?
对于ObjectBox Entities
@Entity()
class Customer {
int id;
@Backlink('customer')
final orders = ToMany<Order>();
}
@Entity()
class Order {
int id;
final customer = ToOne<Customer>();
}
我将父(客户)和嵌套的数据对象(订单)存储在两个相关的框中
Customer customer = domainData.toObjectBox; // but how to get the order out?
customer.orders.add(Order('Order 1')); // shouldn't this be Order(1)?
final customerId = store.box<Customer>().put(customer);
这就是我通常如何实现toObjectBox
方法。到这里,您可以看到这行不通,因为我必须将父节点和嵌套子节点分开。虽然我想我可以用一些意大利面来实现这一点,但我想知道是否有一种聪明的方法来做到这一点,因为我想这应该是一个常见的模式(尽管我还没有找到任何关于它的问题)。
@Entity()
Customer {
int id;
List<Order> orders;
Customer({required this.id, required this.orders});
CustomerObox toObjectBox() {
return CustomerObox(
id: id,
// orders: orders.map((x) => x.toObjectBox()).toList()
);
}
= = =更新 =====================================
我同时试图创建一个返回结构自己,现在我在这个过程中得到这个工作。
class Pair<T1, T2> {
final T1 parent;
final T2 child;
Pair({required this.parent, required this.child});
}
@Entity()
class Customer {
int id;
List<Order> orders;
Customer({required this.id, required this.orders});
static Pair<CustomerObox, List<OrderObox>> toObjectBox(Customer cust) {
Pair<CustomerObox, List<OrderObox>>(
parent: CustomerObox(
id: cust.id,
),
child: cust.orders.map((o) => o.toObjectBox()).toList()
);
}
}
所以我实现了toObjectBox
,如我上面的问题的更新所示。
在我的本地数据源实现中(我使用层:presentation>业务逻辑(集团)>领域(模型、合同等)>库比;我实现了以下方法
@override
Future<void> storeCustomer(Customer customer) async {
// Pair(T1 parent, T2 child) with T2 being List<OrderObox>
final Pair customerObox = Customer.toObjectBox(customer);
final CustomerObox customerParent = customerObox.parent;
final List<OrderObox> customerChildren = customerObox.child;
for (final child in customerChildren)
customerParent.records.add(child);
// puts both, parent and children:
final id = _sBox.put(customerParent);
}
@override
Future<List<Customer>> getAllCustomers() async {
final List<Customer> parents = [];
final List<CustomerObox> parentsObox = await _sBox.getAll();
for (final p in parentsObox) {
final List<CustomerObox> childrenObox = p.records;
parents.add(SessionJournalDto.fromObjectBox(p));
for (final c in childrenObox)
parents.last.records.add(Order.fromObjectBox(c));
}
return parents;
}