使用room persistent library更新参数

Nsn*_*nik 12 android android-sqlite android-room

如何使用房间库更新整行,@ Update使用@Entity注释对象并通过引用主键更新它但是如何通过某些其他参数更新,其中某些值与某行中的单元格中的值匹配.

//Simple update
@Update
int updateObject(ObjectEntity... objectEntities);

//Custom Update
@Query(UPDATE TABLENAME ????)
int updateObject(ObjetEntity objectEntity,String field);
Run Code Online (Sandbox Code Playgroud)

我应该通过什么代替???? 这样新的objectEntity将被字段值匹配的旧object替换.

Jah*_*old 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并且您希望is_alive根据具体情况更新列name.您可以将方法编写为:

@Query("UPDATE people SET is_alive= :alive WHERE name = :name")
public abstract int setIsAliveByName(String name, int alive);
Run Code Online (Sandbox Code Playgroud)

如果你有一个包含许多字段的实体,这当然会变得非常繁琐,因为你必须将每个字段作为单独的参数传递并UPDATE手动编写整个查询.

另一种方法是先执行SELECT查询以获取项目,使用新数据更新对象,然后将其保存回数据库.

在这一点上,你开始怀疑使用ORM是否真的让事情更容易,值得你花时间......


小智 7

要更新多个列,请使用逗号,以分隔列。喜欢以下

@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);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!我使用 AND 而不是逗号,这使我的查询无法正常工作,非常感谢您指定此详细信息,您救了我的一天! (3认同)

Upe*_*hah 5

如果要更新单个或两个字段,请使用

@Query("UPDATE user SET first_name =:fname ,last_name=:lname WHERE email =:email")
int updateUser(String email,String fname, String lname);
Run Code Online (Sandbox Code Playgroud)

如果你想更新太多的字段,那么到目前为止没有任何自定义更新功能来更新多列数据。但是你可以使用一些逻辑,比如。

假设您需要更新 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;
}
Run Code Online (Sandbox Code Playgroud)

首先,您使用选择查询获得 ObjectModel。

@Query("SELECT * FROM user WHERE email = :email")
User getUser(String email);
Run Code Online (Sandbox Code Playgroud)

然后从该 ObjectModel 中获取 id 并将该 id 设置为您的新 ObjectModel

然后将简单更新为房间查询

@Update
void updateUser(User user);
Run Code Online (Sandbox Code Playgroud)

例如:

//here you get whole object and update whichever field you want. In this firstname and email
User userObject = getUser(String email);

userObject.setFirstName("name")
userObject.setEmail("abc@gkj.com")

//now update query
updateUser(User user);
Run Code Online (Sandbox Code Playgroud)

当您想更新更多字段时,这很有用