ルームライブラリを使用して行全体を更新する方法、@ Updateは@Entityアノテーション付きオブジェクトを受け取り、主キーを参照して更新しますが、特定の値が行のセルの値と一致するupdateなどの他のパラメーターを介して更新する方法を教えてください。
//Simple update
@Update
int updateObject(ObjectEntity... objectEntities);
//Custom Update
@Query(UPDATE TABLENAME ????)
int updateObject(ObjetEntity objectEntity,String field);
????の代わりに何を渡すべきですか?新しいobjectEntityは、フィールド値が一致する古いものに置き換えられます。
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
クエリ全体を手動で記述する必要があるため、多くのフィールドを持つエンティティがある場合、これは非常に退屈になる可能性があります。
もう1つの方法は、SELECT
クエリを実行して最初にアイテムをフェッチし、オブジェクトを新しいデータで更新してから、データベースに保存します。
この時点で、ORMを使用することで実際に何かが容易になり、時間をかける価値があるかどうか疑問に思われるようになります...
複数の列を更新するには、カンマを使用して列を区切ります。次のように
@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);
Roomの複合主キーに基づいて更新するには
@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);
部屋に複数の列データを更新するカスタム更新機能はありません。ただし、次のようなロジックを使用できます。
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);
例えば:
//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("[email protected]")
//now update query
updateUser(User user);
これは、より多くのフィールドを更新する場合に便利です。
1つまたは2つのフィールドを更新する場合は、
@Query("UPDATE user SET first_name =:fname ,last_name=:lname WHERE email =:email")
int updateUser(String email,String fname, String lname);