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)
如果要更新单个或两个字段,请使用
@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)
当您想更新更多字段时,这很有用
| 归档时间: |
|
| 查看次数: |
12271 次 |
| 最近记录: |