gpt4 book ai didi

android - 无法使用 ObjectBox 和 Android (Kotlin) 保存相同的数据

转载 作者:行者123 更新时间:2023-11-29 01:00:08 25 4
gpt4 key购买 nike

我正在使用 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>
}

测试

@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 data classeshashCode() 提供自定义实现。 ToMany 使用 HashMap 来跟踪要添加或删除的实体。我想你可以看到这是怎么回事:

基于 Kotlin 数据类实现,如果两个数据类具有相同的属性,则它们的哈希码匹配。现在给出这个例子,根据它们的 hashCode(),有两个相同的 OrderDetail 数据类:

val order = Order().apply {
this.details.add(OrderDetail(productSpecName = "ABC"))
this.details.add(OrderDetail(productSpecName = "ABC"))
}

两个实体将被添加到 ToMany 列表中。但是,内部更改跟踪机制假定第二个实体替换第一个实体,因为 HashMap 认为它们是相同的。因此只有一个被添加。

使 OrderDetail 成为常规类(删除 data 关键字) 删除自定义 hashCode() 实现和一切都按预期工作。

我相信在 Kotlin 中,共享相同属性的两个数据类被认为是“相同的”,因此这种行为是意料之中的。虽然我同意这是不直观的。不确定我们应该在这里做什么。

Related GitHub Issue

关于android - 无法使用 ObjectBox 和 Android (Kotlin) 保存相同的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51837559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com