web-dev-qa-db-fra.com

Android La bibliothèque de persistance de pièce @Update ne fonctionne pas

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!

14
nAkhmedov

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.

6
Maperz

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.

12
Kimmi Dhingra

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

0
moamarubuntu