【问题标题】:using member variable for query in Room在 Room 中使用成员变量进行查询
【发布时间】:2020-09-22 07:10:31
【问题描述】:

我想更新这个Recipe对象的recipeName

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

所以我尝试进行自定义查询,但 android studio 抱怨我需要在 where 子句之前进行 Indexed、Not 或 Set

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

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

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

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

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

【问题讨论】:

    标签: android sqlite android-sqlite android-room


    【解决方案1】:

    考虑下一个方法:

    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 不会改变

    【讨论】:

    • 我喜欢这种方法,但是,我希望名称字段是唯一的,有没有办法与您的设置方式有关?
    • 是的,您可以索引该字段以使其唯一。 Here 是文档链接
    猜你喜欢
    • 2018-04-25
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2020-05-06
    • 1970-01-01
    • 2015-09-17
    相关资源
    最近更新 更多