web-dev-qa-db-ja.com

ルーム永続ライブラリを使用してパラメーターで更新

ルームライブラリを使用して行全体を更新する方法、@ Updateは@Entityアノテーション付きオブジェクトを受け取り、主キーを参照して更新しますが、特定の値が行のセルの値と一致するupdateなどの他のパラメーターを介して更新する方法を教えてください。

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

//Custom Update
@Query(UPDATE TABLENAME ????)
int updateObject(ObjetEntity objectEntity,String field);

????の代わりに何を渡すべきですか?新しいobjectEntityは、フィールド値が一致する古いものに置き換えられます。

15
Nikhil Soni

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_alivenameによって異なります。メソッドは次のように書くことができます:

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

もちろん、各フィールドを個別のパラメーターとして渡し、UPDATEクエリ全体を手動で記述する必要があるため、多くのフィールドを持つエンティティがある場合、これは非常に退屈になる可能性があります。

もう1つの方法は、SELECTクエリを実行して最初にアイテムをフェッチし、オブジェクトを新しいデータで更新してから、データベースに保存します。

この時点で、ORMを使用することで実際に何かが容易になり、時間をかける価値があるかどうか疑問に思われるようになります...

15
Jahnold

複数の列を更新するには、カンマを使用して列を区切ります。次のように

@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);
3
Shahkar Raza

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);
1
Zafar Imam

部屋に複数の列データを更新するカスタム更新機能はありません。ただし、次のようなロジックを使用できます。

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);
1
Upendra Shah