在 Room 中使用成员变量进行查询

using member variable for query in Room

我想更新这个 Recipe 对象的 recipeName

@Entity
data class Recipe(
    @PrimaryKey
    val recipeName: String,
    val image: String?
)

所以我尝试执行自定义查询,但是 android 工作室抱怨我需要在 where 子句之前使用 Indexed、Not 或 Set

@Query("UPDATE Recipe WHERE recipeName = :oldName ")
suspend fun update(recipe: Recipe, oldName: String)

所以我尝试这样做,问题是我不知道如何通过函数中的食谱对象参数访问食谱名称,以便我可以在查询中使用它。我什至不知道这是否可能。

   @Query("UPDATE Recipe SET recipeName = :recipe.recipeName WHERE recipeName = :oldName  ")
    suspend fun update(recipe: Recipe, oldName: String)

只是为了澄清这是行不通的,但这就是我想要实现的目标 -> recipe.recipeName

当然,我可以只传入新名称而不是整个食谱对象,这样就可以解决这个问题,但是我必须传入我的食谱实体的每个变量,如果它可能会失控长得太多所以如果我有选择我宁愿不...

考虑下一种方式:

  1. 更改 Recipe 结构 - 添加自动生成的 id (Int) 作为主键,recipeName 将是普通字段。
  2. 要首先在您的代码中更改您的 Recipe,您应该获取以前版本的 Recipe 对象(如果您还没有):
@Query("SELECT * from Recipe WHERE recipeName = :oldName")
suspend fun getRecipeByName(oldName: String): Recipe?

然后您可以更改任何您想要的字段(name 等等)并使用

保存更改
@Update
suspend fun updateRecipe(recipe: Recipe)

你可以这样做,因为对象的 id 不会改变