Comment puis-je mettre à jour une ligne entière à l'aide de la bibliothèque de salles, @Update prend un objet annoté @Entity et le met à jour via la clé primaire de référence, mais comment puis-je mettre à jour via un autre paramètre tel que update où certaines valeurs correspondent à une valeur dans une cellule à la fois.
//Simple update
@Update
int updateObject(ObjectEntity... objectEntities);
//Custom Update
@Query(UPDATE TABLENAME ????)
int updateObject(ObjetEntity objectEntity,String field);
Que devrais-je passer à la place de ???? de telle sorte que la nouvelle objectEntity soit remplacée par l'ancienne qui correspond à la valeur du champ.
Vous devez connaître la colonne à laquelle vous appariez à l'avance, car Room ne vous permet pas de définir la colonne de manière dynamique. Disons que vous avez une entité Person
comme suit:
@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;
}
}
Et vous vouliez mettre à jour la colonne is_alive
en fonction de la name
. Vous pouvez écrire la méthode en tant que:
@Query("UPDATE people SET is_alive= :alive WHERE name = :name")
public abstract int setIsAliveByName(String name, int alive);
Cela peut bien sûr devenir fastidieux si vous avez une entité qui a plusieurs champs, car vous devez passer chaque champ en tant que paramètre séparé et écrire la requête UPDATE
entière à la main.
L'alternative consiste à effectuer une requête SELECT
pour récupérer les éléments en premier, mettre à jour les objets avec les nouvelles données, puis les enregistrer à nouveau dans la base de données.
C'est à ce moment-là que vous commencez à vous demander si l'utilisation d'un ORM facilite réellement quelque chose et vaut votre temps ...
pour mettre à jour plusieurs colonnes, utilisez une virgule, pour séparer les colonnes. comme suivre
@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);
Pour mettre à jour sur la base de la clé primaire composite dans 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);