Mettre à jour un champ spécifique d'une entité dans la salle android

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

Méthode 1:

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

Mais quand j'essaie de mettre à jour en utilisant cette méthode, il met à jour chaque champ de l'entité où il correspond à la valeur de la clé primaire de l'objet tour. J'ai utilisé @Query

Méthode 2:

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

Cela fonctionne mais est une requête trop longue dans mon cas car j'ai beaucoup de champs dans mon entité. Je vous voulez savoir comment puis-je mettre à jour un champ(pas tous) comme method 1 où id = 1;(id est la clé primaire de génération automatique).

Entity:

@Entity
public class Tour {
    @PrimaryKey(autoGenerate = true)
    public long id;
    private String startAddress;
    private String endAddress;
    //constructor, getter and setter
}
33
demandé sur Abu Mohammad Rasel 2017-08-21 07:29:01

3 réponses

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

Utiliser @Query, comme vous l'avez fait dans la Méthode 2.

Est une requête trop longue dans mon cas car j'ai beaucoup de champs dans mon entité

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

IOW, il N'y a rien dans la chambre elle - même qui fera ce que vous cherchez.

23
répondu CommonsWare 2017-08-21 11:54:43

Selon SQLite mettre à Jour les 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);
}
10
répondu Jurij Pitulja 2018-03-29 21:08:44

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

  1. vous devez créer une classe dbManager qui initialisera la base de données dans son constructeur et agira comme médiateur entre votre viewModel et DAO, et aussi .
  2. Le ViewModel initialise 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);
    

    Ensuite, mettez à jour votre élément utilisateur de cette façon, supposons que votre identifiant soit 1122 et votre nom d'utilisateur est " xyz "qui doit être changé en "zyx".

    Récupère un userItem de l'id 1122 User object

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

C'est un code brut, j'espère que cela vous aidera.

Codage Heureux

0
répondu Kunal Parte 2018-05-25 10:38:55