J'essaie de mettre à jour ma base de données via la nouvelle bibliothèque de salle Android, mais cela ne fonctionne pas. Voici mon approche
@IgnoreExtraProperties
@Entity(tableName = CarModel.TABLE_NAME,
indices = {@Index(value = "car_name", unique = true)})
public class CarModel {
public static final String TABLE_NAME = "cars";
@PrimaryKey(autoGenerate = true)
private int id;
@ColumnInfo(name = "car_name")
private String name;
@ColumnInfo(name = "car_price")
private String price;
private String type;
private String position;
}
MainActivity.Java
viewModel.isCarsEmpty().observe(MainActivity.this, new Observer<Integer>() {
@Override
public void onChanged(@Nullable Integer rowCount) {
if (rowCount == 0) {
viewModel.insertItems(list);
} else {
viewModel.updateItems(list);
}
}
});
CarViewModel.Java
public LiveData<Integer> isCarsEmpty() {
return appDatabase.carDao().isDbEmpty();
}
public void insertItems(List<CarModel> carModels) {
new insertCarsAsyncTask(appDatabase).execute(carModels);
}
private class insertCarsAsyncTask extends AsyncTask<List<CarModel>, Void, Void> {
private AppDatabase db;
public insertCarsAsyncTask(AppDatabase appDatabase) {
db = appDatabase;
}
@Override
protected Void doInBackground(List<CarModel>... params) {
db.carDao().insertCars(params[0]);
return null;
}
}
public void updateItems(List<CarModel> list) {
new updateCarsTask(appDatabase).execute(list);
}
private class updateCarsTask extends AsyncTask<List<CarModel>, Void, Void> {
private AppDatabase db;
public updateCarsTask(AppDatabase appDatabase) {
db = appDatabase;
}
@Override
protected Void doInBackground(List<CarModel>... params) {
db.carDao().updateCars(params[0]);
return null;
}
}
CarDao.Java
@Insert(onConflict = REPLACE)
void insertCars(List<CarModel> cars);
@Update
void updateCars(List<CarModel> param);
@Query("SELECT count(*) FROM " + CarModel.TABLE_NAME)
LiveData<Integer> isDbEmpty();
J'ai fait le débogage, de nouvelles données arrivent et j'appelle la méthode viewModel.updateItems (list) .Merci d'avance!
Je suis désolé d'avoir posté ceci comme réponse mais je ne suis pas encore autorisé à ajouter un simple commentaire alors voici mon idée:
Avez-vous essayé d'utiliser uniquement insertCars()
au lieu de updateCars()
? Quoi qu'il en soit, il semble que votre rappel isCarsEmpty()
LiveData soit déclenché tout le temps parce que lorsque l'observateur est appelé, la base de données est à nouveau modifiée .. Je ne sais pas trop ce que vous voulez accomplir.
Assurez-vous que la ligne que vous souhaitez mettre à jour et le modèle que vous envoyez pour mettre à jour doivent avoir le même identifiant que vous avez défini comme clé primaire.
La mise à jour signifie que vous récupérez un CarModel
qui est déjà dans la base de données et après la mise à jour de ce CarModel
vous renvoyez les nouvelles valeurs à la base de données, sauf l'id vous renvoyez le même id
que faire
vous avez besoin par exemple d'une variable globale de type CarModel
et implémentez les fonctions set dans le CarModel
Dans MainActivity, affectez le CarModel récupéré à la variable globale et utilisez les fonctions définies pour mettre à jour les valeurs des variables membres du CarModel
puis passez cette variable globale à la fonction de mise à jour dans MainActivity
J'ai un exemple dans mon Github comme celui-ci