只要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)
}
答案 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类必须包含一个 目标实体的字段子集及其主键。
只有部分实体字段表示的列为 如果找到具有相同主键的实体,则更新。
默认情况下,目标实体由方法参数解释。