在DAO查询方法中传递POJO作为参数以更新列的子集?

时间:2019-07-18 01:01:44

标签: android android-room

只要POJO的字段与查询结果中的列名匹配,Room即可从您的查询方法中return arbitrary POJOs

我很好奇是否有可能进行相反操作。将POJO传递给查询方法以更新特定列。

@Entity
data class Quiz(
        @PrimaryKey
        val id: Int,
        val completedCount: Int,
        val bestScore: Int,
        @Embedded val stats: Stats
)

data class Stats(
        val right: Int,
        val wrong: Int
)

@Dao
interface QuizDao {

    // OK.. passing in each column to be updated
    @Query("update quiz set `right` = :right, wrong = :wrong, where id = :id")
    fun updateStats(id: Int, right: Int, wrong: Int)

    // ERROR.. POJO fields can't be mapped to columns
    @Query("update quiz set `right`, wrong where id = :id")
    fun updateStats(id: Int, stats: Stats)
}

2 个答案:

答案 0 :(得分:1)

您只需指定@Update并通过POJO即可。

@Update 
void updateUsers(List<User> users);

@Update
void updateUser(User user);

您的POJO应该是

@Entity(tableName = "user")   
public class User
{
    //class menbers
}

这对我有用。

答案 1 :(得分:0)

截至Room 2.2.0-alpha01(2019年7月10日):

  

目标实体:DAO注释@ Insert,@ Update和@Delete现在   有一个新属性targetEntity,可以指定目标   DAO方法要作用的表。这允许   这些DAO方法的参数是任意POJO,它们将是   解释为部分实体。实际上,这允许部分   插入,删除和更新。

该属性实际上被命名为entity而不是targetEntity,并且似乎可以部分更新。

示例用法

@Entity
data class User(
        @PrimaryKey
        val id: Int,
        val firstName: String,
        val lastName: String,
        @Embedded val favorites: Favorites
)

data class Favorites(
        var animal: String,
        var color: String
)

data class UserName(
        var id: Int,
        var firstName: String,
        var lastName: String
)

data class UserFavorites(
        var id: Int,
        @Embedded var favorites: Favorites
)

@Dao
interface UserDao {

    @Update(entity = User::class)
    fun updateName(name: UserName)

    @Update(entity = User::class)
    fun updateFavorites(favorites: UserFavorites)
}

根据entity属性的documentation,将仅更新部分实体字段,这就是我们想要的:

  

更新方法的目标实体。

     

声明时,更新方法参数解释为   参数的类型不同于   目标。代表实体的POJO类必须包含一个   目标实体的字段子集及其主键。

     

只有部分实体字段表示的列为   如果找到具有相同主键的实体,则更新。

     

默认情况下,目标实体由方法参数解释。