无法更新会议室数据库项目

时间:2019-12-23 09:45:05

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

我正在尝试更新会议室数据库中某个项目的列,但是该项目没有更新。

我的实体:

    @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协程进行数据库操作。我的数据库有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)
   }

1 个答案:

答案 0 :(得分:1)

我认为有两种方法。

1.in saveEditedItem(...)中有趣地添加了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)
    }