2017-10-06 2 views
4

Comment mettrai-je à jour une ligne entière en utilisant room library, le @Update prend un objet annoté @Entity et le mets à jour en référençant la clé primaire mais comment vais-je mettre à jour via un autre paramètre value correspond à une valeur dans la cellule d'une ligne.Mise à jour avec paramètre utilisant la bibliothèque persistante room

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

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

Que dois-je passer à la place de ???? de sorte que le nouvel objectEntity est remplacé par un ancien où la valeur du champ correspond.

Répondre

4

Vous devez savoir à l'avance quelle colonne vous voulez comparer car Room ne vous permet pas de définir dynamiquement la colonne. 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 du name. Vous pouvez écrire la méthode comme:

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

Bien sûr, pourrait être assez fastidieux si vous avez une entité qui a de nombreux domaines parce que vous devez passer dans chaque champ comme paramètre séparé et écrire la UPDATE toute la requête à la main .

L'alternative est de faire une requête SELECT pour récupérer les éléments, mettre à jour les objets avec les nouvelles données, puis les sauvegarder dans la base de données.

C'est à ce moment que vous commencez à vous demander si l'utilisation d'un ORM rend vraiment quelque chose de plus facile et vaut votre temps ...