如何使用会议室库更新整行,@ Update采用@Entity注释对象并通过引用主键更新它但是我将如何更新其他参数,如更新,其中某些值与单元格中的值匹配一排。
//Simple update
@Update
int updateObject(ObjectEntity... objectEntities);
//Custom Update
@Query(UPDATE TABLENAME ????)
int updateObject(ObjetEntity objectEntity,String field);
我应该通过什么代替????这样新的objectEntity将被字段值匹配的旧的替换。
答案 0 :(得分:15)
由于Room不允许您动态定义列,因此您必须提前知道要匹配的列。假设您有一个实体Person
,如下所示:
@Entity(tableName = "people")
public final class Person {
@PrimaryKey
@ColumnInfo(name = "uuid")
public final String uuid;
@ColumnInfo(name = "name")
public final String name;
@ColumnInfo(name = "is_alive")
public final Boolean isAlive;
public Person(String uuid, String name, Boolean isAlive) {
this.uuid = uuid;
this.name = name;
this.isAlive = isAlive;
}
}
您希望根据is_alive
更新专栏name
。您可以将方法编写为:
@Query("UPDATE people SET is_alive= :alive WHERE name = :name")
public abstract int setIsAliveByName(String name, int alive);
如果您有一个包含许多字段的实体,这当然会变得非常繁琐,因为您必须将每个字段作为单独的参数传递并手动编写整个UPDATE
查询。
另一种方法是先执行SELECT
查询以获取项目,使用新数据更新对象,然后将其保存回数据库。
在这一点上,你开始怀疑使用ORM是否真的让事情更轻松,值得你花时间......
答案 1 :(得分:6)
要更新多个列,请使用逗号分隔列。喜欢
@Query("UPDATE DailyConsumption SET quantity = :quantity ,date_time= :dateTime,date= :date WHERE id LIKE :id ")
int updateItem(int id,int quantity,long dateTime,String date);
答案 2 :(得分:1)
要根据会议室中的组合主键进行更新
@Query("UPDATE RecentDestinations SET readStatus=:readStatus WHERE name = :name AND street = :street AND state = :state AND postCode = :postcode")
void updateStatus(boolean readStatus,String name,String street,String suburb,String state,String postcode);
答案 3 :(得分:0)
房间中没有任何自定义更新功能来更新多列数据。但是您可以使用类似的逻辑。
假设您需要更新last_name
@Entity(tableName = "user")
public class User {
@NonNull
@PrimaryKey
private int id;
private String user_id;
private String first_name;
private String last_name;
private String email;
}
首先,使用选择查询获得ObjectModel。
@Query("SELECT * FROM user WHERE email = :email")
User getUser(String email);
然后从该ObjectModel获取ID,并将该ID设置为新的ObjectModel
然后简单地更新为房间查询
@Update
void updateUser(User user);