美文网首页
ObjectBox 数据表关联

ObjectBox 数据表关联

作者: jkwen | 来源:发表于2021-05-21 00:02 被阅读0次

    数据表之间肯定要存在关联,例如一个学生可以有很多本书,这里就有一个 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 的关联更新方法,

    • setTarget(target)
    • setTargetId(targetId)
    • setAndPutTarget(target)
    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 的操作就可以了。看上去很简单,具体还是要实践才能知道深浅。

    相关文章

      网友评论

          本文标题:ObjectBox 数据表关联

          本文链接:https://www.haomeiwen.com/subject/qeeijltx.html