【问题标题】:Android development Room SQL queryAndroid开发室SQL查询
【发布时间】:2021-11-03 08:23:33
【问题描述】:

我想在表格中添加一个项目,但是如果该项目已经存在于表格中,我想修改一个列,这是我的道

@Dao
interface BasketDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun upsert(item: BasketItem)

    @Delete
    suspend fun delete(item: BasketItem)

    @Query("SELECT * FROM basket_items")
    fun loadBasketItems(): LiveData<List<BasketItem>>
}

我已经有一个upsert函数的冲突策略,如果项目存在就替换它,但是我只想在项目存在时修改列的值,而不是替换整个项目,我该怎么办

【问题讨论】:

  • 你能举个例子吗?
  • 如果我在数据库表中有一个名为“item1”的项目,当我添加另一个名为“item1”的项目时,我希望 item1 中的“数量”列增加 1跨度>
  • 显示 BasketItem 实体。

标签: sql kotlin android-room


【解决方案1】:

您可以使用两个数据库调用来执行此操作(一个用于查询现有项目,第二个用于插入/替换该项目)。

在道:

@Query("SELECT * FROM basket_items WHERE name = :name")
suspend fun getItemByName(name: String): BasketItem?

然后在你的数据层:

val newItemToSave = //
val existingItem = basketDao.getItemByName(newItemToSave.name)
if(existingItem == null)
    basketDao.upsert(newItemToSave)
else
    basketDao.upsert(existingItem.copy(quantity = existingItem.quantity + 1)

【讨论】:

  • 如果我使用“WHERE item_name = name),它不知道函数的参数名称是谁,但如果我使用:name,它知道,为什么会发生这种情况?“:”代表什么?
  • 如果这个功能有效,你刚刚解决了我的问题,我会在一个小时左右尝试实现它,我会回来接受你的回答
  • ":" 只表示下一个单词代表一个函数参数,否则它只会认为它是一个普通字符串
  • 但是我是否可以将 BasketItem 作为函数参数传递并修改查询以搜索项目本身,或者我是否需要从该项目中指定一个列,例如名称、价格等属性,数量或该表中项目具有的任何其他列
  • 所写的查询是一个sql查询,所以我们不能传递整个对象。要查找特定项目,最好的方法是传递唯一标识该项目的主键。
猜你喜欢
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
相关资源
最近更新 更多