我正在使用 ObjectBox 来保存数据。当我使用 ToMany 保存相同的数据时,它只保存第一个数据。
- 对象框(版本:2.0.0)
- Android(目标sdk版本:27)
- Kotlin(版本:1.2.60)
这是我的代码。
@Entity
data class Order(@Id var id: Long = 0,
val createTime: Long = 0,
val total: Int = 0) {
@Backlink(to = "order")
lateinit var details: ToMany<OrderDetail>
}
@Entity
data class OrderDetail(@Id var id: Long = 0,
val productName: String = "",
val productSpecName: String = "",
val productSpecPrice: Int = 0,
val quantity: Int = 0,
val subtotal: Int = 0) {
lateinit var order: ToOne<Order>
}
The test
@Test
fun orderDetailTest() {
val orderBox = store.boxFor(Order::class.java)
// 儲存兩個內容相同的資料
val order = Order().apply {
this.details.add(OrderDetail(productSpecName = "ABC"))
this.details.add(OrderDetail(productSpecName = "ABC"))
}
val orderId = orderBox.put(order)
val result = orderBox.get(orderId)
assert(result.details.size == 2)
}
result.details 的大小为 1。
我可以使用 ToMany 保存多个相同的数据吗?我该如何修复它?
感谢您的回答。
Kotlin 数据类 https://kotlinlang.org/docs/reference/data-classes.html除其他外,还提供自定义实现hashCode()
. ToMany
uses a HashMap
跟踪要添加或删除的实体。我想你可以看到这是怎么回事:
基于 Kotlin 数据类实现,如果两个数据类具有相同的属性,则它们的哈希码匹配。现在给出这个例子,有两个相同的OrderDetail
数据类别根据其hashCode()
:
val order = Order().apply {
this.details.add(OrderDetail(productSpecName = "ABC"))
this.details.add(OrderDetail(productSpecName = "ABC"))
}
两个实体将被添加到ToMany
列表。然而,内部变更跟踪机制假设第二个实体取代了第一个实体,因为HashMap
相信他们是一样的。因此只添加一个。
Making OrderDetail
常规课程(删除data
关键词)放弃定制hashCode()
实施并且一切都按预期进行。
我相信在 Kotlin 中,共享相同属性的两个数据类被认为是“相同的”,因此这种行为是预期的。尽管我同意这是不直观的。不知道我们应该在这里做什么。
相关 GitHub 问题 https://github.com/objectbox/objectbox-java/issues/528
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)