我正在尝试更新房间数据库中项目的列,但该项目没有更新。
我的实体:
@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)
}
最佳答案
我认为有两种方法。
1.在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)
}
关于android - 无法更新房间数据库项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59453124/