【问题标题】:Can't Update Room database item无法更新房间数据库项目
【发布时间】:2020-04-14 14:42:20
【问题描述】:

我正在尝试更新房间数据库中某个项目的列,但该项目没有更新。

我的实体:

    @Entity(tableName = "order_summary_table")
    data class SummaryItem(
    @ColumnInfo(name = "quantity")
    var quantity: Int = -1,

    @ColumnInfo(name = "item_name")
    val name: String,

    @ColumnInfo(name = "item_price")
    var price: Int
    ) {
    @PrimaryKey(autoGenerate = true)
    var itemId: Long = 0
    }

这是我的道:

    @Update
    fun update(summaryItem: SummaryItem)

    @Query("SELECT * FROM order_summary_table WHERE itemId = :key")
    suspend fun get(key: Long): SummaryItem?

ViewModel 中的函数。我正在使用 Kotlin Coroutines 进行数据库操作。我的数据库有 3 列:数量、名称和价格。这里我写了一个函数来更新数据库中某项的数量列:

   fun saveEditedItem(quantity: Int, summaryItemKey: Long) {
      coroutineScope.launch {
           val item = database.get(summaryItemKey)
           val editedItem = SummaryItem(quantity, item!!.name, item.price)
           updateSummaryItem(editedItem)
       }
   }

   private suspend fun updateSummaryItem(summaryItem: SummaryItem) {
      withContext(Dispatchers.IO) {
          database.update(summaryItem)
      }
   }

Fragment.kt 文件,在这里我设置了一个 OnClickListener 来更新按钮单击时的项目​​,但项目没有得到更新。

   val quantityText = binding.editQuantityText
   binding.saveButton.setOnClickListener {
        val editTextValue = quantityText.text
        val quantity = Integer.parseInt(editTextValue.toString())
        viewModel.saveEditedItem(quantity, arguments.summaryItemKey)
   }

【问题讨论】:

  • 不更新是什么意思?数据库条目没有更新?您正在观察的 LiveData 对象没有更新?需要更多信息
  • 请包括您的实体
  • 您能否验证主键与您尝试更新的主键相同?
  • updateSummaryItem(editedItem)线上下断点,在调试中运行。 itemId 的值是多少?我的猜测是 0,您需要将其设置为 summaryItemKeyitem.itemId 的值(应该是相同的值)。

标签: android kotlin android-room kotlin-coroutines kotlin-android-extensions


【解决方案1】:

我认为有两种方法。

1.in saveEditedItem(...)fun add itemId PrimaryKey

coroutineScope.launch {
    val item = database.get(summaryItemKey)
    val editedItem = SummaryItem(quantity, item!!.name, item.price)
    editedItem.itemId = item.itemId
    updateSummaryItem(editedItem)
}

2.更新项目本身。

coroutineScope.launch {
        val item = database.get(summaryItemKey)
        item.quantity = //newQuantity
        item.name = // newName
        item.price = // newPrice
        updateSummaryItem(item)
    }

【讨论】:

    猜你喜欢
    • 2019-01-17
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    • 2022-11-09
    相关资源
    最近更新 更多