web-dev-qa-db-fra.com

Mettre à jour un champ spécifique d'une entité dans Android Room

J'utilise Android bibliothèque de persistance de la pièce pour mon nouveau projet. Je veux mettre à jour un champ de la table. J'ai essayé comme dans mon Dao -

// Method 1:

@Dao
public interface TourDao {
    @Update
    int updateTour(Tour tour);
}

Mais lorsque j'essaye de mettre à jour en utilisant cette méthode, elle met à jour tous les champs de l'entité où elle correspond à la valeur de clé primaire de l'objet tour. J'ai utilisé @Query

// Method 2:

@Query("UPDATE Tour SET endAddress = :end_address WHERE id = :tid")
int updateTour(long tid, String end_address);

Cela fonctionne mais il y aura beaucoup de requêtes dans mon cas car j'ai plusieurs champs dans mon entité. Je veux savoir comment puis-je mettre à jour certains champs (pas tous) comme Method 1 où id = 1; (id est la clé primaire générer automatiquement).

// Entity:

@Entity
public class Tour {
    @PrimaryKey(autoGenerate = true)
    public long id;
    private String startAddress;
    private String endAddress;
    //constructor, getter and setter
}
81
Abu Mohammad Rasel

Je veux savoir comment puis-je mettre à jour certains champs (pas tous) comme la méthode 1 où id = 1

Utilisez @Query, comme dans la méthode 2.

est trop longue requête dans mon cas parce que j'ai beaucoup de champ dans mon entité

Ensuite, avoir des entités plus petites. Ou, ne mettez pas à jour les champs individuellement, mais avez plutôt des interactions plus grossières avec la base de données.

IOW, il n'y a rien dans Room lui-même qui fera ce que vous cherchez.

47
CommonsWare

Selon SQLite Update Docs :

<!-- language: lang-Java -->
@Query("UPDATE tableName SET 
    field1 = :value1,
    field2 = :value2, 
    ...
    //some more fields to update
    ...
    field_N= :value_N
    WHERE id = :id)

int updateTour(long id, 
               Type value1, 
               Type value2, 
               ... ,
               // some more values here
               ... ,
               Type value_N);

Exemple:

Entité:

@Entity(tableName = "orders")
public class Order {

@NonNull
@PrimaryKey
@ColumnInfo(name = "order_id")
private int id;

@ColumnInfo(name = "order_title")
private String title;

@ColumnInfo(name = "order_amount")
private Float amount;

@ColumnInfo(name = "order_price")
private Float price;

@ColumnInfo(name = "order_desc")
private String description;

// ... methods, getters, setters
}

Dao:

@Dao
public interface OrderDao {

@Query("SELECT * FROM orders")
List<Order> getOrderList();

@Query("SELECT * FROM orders")
LiveData<List<Order>> getOrderLiveList();

@Query("SELECT * FROM orders WHERE order_id =:orderId")
LiveData<Order> getLiveOrderById(int orderId);

/**
* Updating only price
* By order id
*/
@Query("UPDATE orders SET order_price=:price WHERE order_id = :id")
void update(Float price, int id);

/**
* Updating only amount and price
* By order id
*/
@Query("UPDATE orders SET order_amount = :amount, price = :price WHERE order_id =:id")
void update(Float amount, Float price, int id);

/**
* Updating only title and description
* By order id
*/
@Query("UPDATE orders SET order_desc = :description, order_title= :title WHERE order_id =:id")
void update(String description, String title, int id);

@Update
void update(Order order);

@Delete
void delete(Order order);

@Insert(onConflict = REPLACE)
void insert(Order order);
}
47
Jurij Pitulja

Peut-être que vous pouvez essayer ceci, mais la performance sera un peu pire (ou plus):

@Dao
public abstract class TourDao {

    @Query("SELECT * FROM Tour WHERE id == :id")
    public abstract Tour getTour(int id);

    @Update
    public abstract int updateTour(Tour tour);

    public void updateTour(int id, String end_address) {
        Tour tour = getTour(id);
        tour.end_address = end_address;
        updateTour(tour);
    }
}
3
SuperYao