Библиотека сохранения на уровне Android @Update не работает

Я пытаюсь обновить свою базу данных через новую библиотеку комнат для Android, но она не работает. Вот мой подход

@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();

Я отлаживал, появлялись новые данные и вызывал метод viewModel.updateItems(list). Спасибо заранее!

Ответ 1

Я сожалею, что разместил это как ответ, но мне не разрешено добавлять простой комментарий, но вот моя идея:

Вы пытались использовать только insertCars() вместо updateCars()? В любом случае, похоже, что ваш обратный вызов isCarsEmpty() LiveData запускается все время, потому что, когда наблюдатель называется, база данных снова изменяется. Я не совсем уверен, чего вы хотите достичь.

Ответ 2

Убедитесь, что строка, которую вы хотите обновить, и модель, которую вы отправляете для обновления, должна иметь тот же идентификатор, который вы определили как первичный ключ.

Ответ 3

Обновление означает, что вы CarModel который уже находится в базе данных, и после обновления этой CarModel вы возвращаете новые значения в базу данных, кроме идентификатора, который вы возвращаете тот же Id

что делать

вам нужна, например, глобальная переменная типа CarModel и реализовать функции набора в CarModel

В MainActivity присвойте извлеченную CarModel глобальной переменной и используйте функции set для обновления значений переменных-членов CarModel.

затем передайте эту глобальную переменную в функцию обновления в MainActivity

У меня есть пример в моем Github, как это