【发布时间】: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,您需要将其设置为 summaryItemKey 或 item.itemId 的值(应该是相同的值)。
标签: android kotlin android-room kotlin-coroutines kotlin-android-extensions