179 votes

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

J'utilise android chambre persistance de la bibliothèque pour mon nouveau projet. Je veux mettre à jour le champ de la table. J'ai essayé dans mon Dao -

// Method 1:

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

Mais quand j'essaie de mettre à jour en utilisant cette méthode, puis il met à jour tous les champs de l'entité à laquelle elle correspond à la valeur de la clé primaire de la tour de l'objet. Je l'ai utilisé, @Query

// Method 2:

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

C'est un travail, mais il y aura beaucoup de requêtes dans mon cas, car j'ai beaucoup de champs dans mon entité. Je veux savoir comment puis-je mettre à jour certaines (pas toutes) comme Method 1 where id = 1; (id est automatiquement générer la clé primaire).

// Entity:

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

132voto

Jurij Pitulja Points 840

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, intid);

/**
* 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);
}
 

88voto

CommonsWare Points 402670

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

Utilisez @Query , comme vous l'avez fait 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.

10voto

SuperYao Points 31

Peut-être que vous pouvez essayer ceci, mais les performances seront un peu moins bonnes (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);
    }
}
 

-3voto

Kunal Parte Points 115

Si vous avez besoin de mettre à jour des informations de l'utilisateur pour un utilisateur spécifique ID "x",

  1. vous devez créer un dbManager classe qui va initialiser la base de données dans son constructeur et agit comme un médiateur entre votre viewModel et DAO, et aussi .
  2. Le ViewModel d'initialiser une instance de dbManager pour accéder à la base de données. Le code devrait ressembler à ceci:

       @Entity
        class User{
        @PrimaryKey
        String userId;
        String username;
        }
    
        Interface UserDao{
        //forUpdate
        @Update
        void updateUser(User user)
        }
    
        Class DbManager{
        //AppDatabase gets the static object o roomDatabase.
        AppDatabase appDatabase;
        UserDao userDao;
        public DbManager(Application application ){
        appDatabase = AppDatabase.getInstance(application);
    
        //getUserDao is and abstract method of type UserDao declared in AppDatabase //class
        userDao = appDatabase.getUserDao();
        } 
    
        public void updateUser(User user, boolean isUpdate){
        new InsertUpdateUserAsyncTask(userDao,isUpdate).execute(user);
        }
    
    
    
        public static class InsertUpdateUserAsyncTask extends AsyncTask<User, Void, Void> {
    
    
         private UserDao userDAO;
         private boolean isInsert;
    
         public InsertUpdateBrandAsyncTask(BrandDAO userDAO, boolean isInsert) {
           this. userDAO = userDAO;
           this.isInsert = isInsert;
         }
    
         @Override
         protected Void doInBackground(User... users) {
           if (isInsert)
        userDAO.insertBrand(brandEntities[0]);
           else
        //for update
        userDAO.updateBrand(users[0]);
        //try {
        //  Thread.sleep(1000);
        //} catch (InterruptedException e) {
        //  e.printStackTrace();
        //}
           return null;
         }
          }
        }
    
         Class UserViewModel{
         DbManager dbManager;
         public UserViewModel(Application application){
         dbmanager = new DbMnager(application);
         }
    
         public void updateUser(User user, boolean isUpdate){
         dbmanager.updateUser(user,isUpdate);
         }
    
         }
    
    
    
    
    Now in your activity or fragment initialise your UserViewModel like this:
    
    UserViewModel userViewModel = ViewModelProviders.of(this).get(UserViewModel.class);
    

    Puis il suffit de mettre à jour vos utilisateurs élément de cette façon, supposons que votre nom d'utilisateur est en 1122 et le nom d'utilisateur est "xyz", ce qui doit être changé pour "zyx".

    Obtenir un userItem de 1122 id Utilisateur de l'objet

User user = new user();
 if(user.getUserId() == 1122){
   user.setuserName("zyx");
   userViewModel.updateUser(user);
 }

C'est un code brut, espérons que cela vous aide.

Bon codage

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X