web-dev-qa-db-fra.com

Mise à jour avec paramètre à l'aide de la bibliothèque de salle persistante

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.

9
Nsnik

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 ...

15
Jahnold

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

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