ObjectBox 数据表关联

2021-05-21  本文已影响0人  jkwen

数据表之间肯定要存在关联,例如一个学生可以有很多本书,这里就有一个 1 对 多的关联关系,在 ObjectBox 里,学生叫做 source 对象,书本叫 target 对象。只有一个 target 对象就叫 1 对 1 的关系,如果有多个,像这个例子这样就叫 1 对 多 的关系。

1 对 1

ObjectBox 的例子是这样的,

@Entity
data class Customer(
    @Id var id: Long = 0
)

@Entity
data class Order(
        @Id var id: Long = 0) {
    lateinit var customer: ToOne<Customer>
}
//订单和客户是一对一的关系,但返过来,客户和订单就是一对多的关系了
//对于一对一的关系赋值是这样的
val order = Order()
val customer = Customer()
order.customer.target = customer
boxStroe.boxFor(Order::class.java).put(order)
//虽然看去只存储了 order,但其实因为 order 和 customer 建立了关联
//所以如果 customer 也是新增的,会有一个隐式的 put 操作来存储 customer
//这里要注意,如果像之前说的,如果ID是自己控制赋值的,那么 customer 即使是新增的
//也需要显示的去做 put 操作

//如果仅仅是断开关联关系,可以这样
//这不会影响 customer 在数据表里的存储
order.customer.target = null
boxStore.boxFor(Order::class.java).put(order)

1 对多

首先要留意的是,获取 1 对多关系数据是有缓存的,所以建议想要获取更新后的数据,最好先重新获取 source 对象,然后再去拿 target 对象。

一对多的实现要稍微复杂些,首先,在 source 对象上需要用到 @Backlink 声明 target 对象和这个 source 对象是 1 对 1 的关系。其次,如果 target 对象有多个 1 对 1 的关系的话,那在 source 对象里的 @Backlink 后面要指明是和哪个 1 对 1 关系建立 1 对 多的关系。

@Entity
data class Customer(
        @Id var id: Long = 0
) {
    //在这里说明和 order 是 1 对多的关系
    //就当前例子,因为 order 只有一个 1 对 1 的关系,所以后面的 to 赋值可以省略
    @Backlink(to = "customer")
    lateinit var orders: ToMany<Order>
}
//对刚才的 order 类没有什么变化
@Entity
data class Order(
        @Id var id: Long = 0
) {
    lateinit var customer: ToOne<Customer>
}

//因为 ToMany 实现的是 Java List 接口,所以怎么对待 List,就可以怎么对待例子中的 orders
//例如添加用 add,可以遍历获取每个 order,删除用 remove
//这里有个疑问,当使用 remove 且更新 customer 之后,数据表里还有这个 order 吗?文档没看懂

多对多

更复杂的关联就是多对多,也算是 ToMany,但使用起来比 1 对多简单,仅仅用 ToMany 标识就好了。更多内容可以参看官方文档 Relations

数据更新

前面说的是关联关系的建立或解绑,这里说的是数据表属性的更新,还是像普通的更新操作一样,哪张表需要更新就用对应的 Box 去操作。

关联更新

1 对 1 的关联更新方法,

order.customer.setTarget(customer)
order.customer.setCustomerId(customer.getId())

Order order = new Order();
//对于新增的数据,在调用 setAndPutTarget 之前要做 attach 操作
orderBox.attach(order);
order.customer.setAndPutTarget(customer);

1 对 多 的关联更新方法,

对于 1 对 多,只要遵循 Java List 的操作就可以了。看上去很简单,具体还是要实践才能知道深浅。

上一篇下一篇

猜你喜欢

热点阅读