Я пытаюсь обновить свою базу данных через новую библиотеку комнат для 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). Спасибо заранее!
Я сожалею, что разместил это как ответ, но мне не разрешено добавлять простой комментарий, но вот моя идея:
Вы пытались использовать только insertCars()
вместо updateCars()
?
В любом случае, похоже, что ваш обратный вызов isCarsEmpty()
LiveData запускается все время, потому что, когда наблюдатель называется, база данных снова изменяется. Я не совсем уверен, чего вы хотите достичь.
Убедитесь, что строка, которую вы хотите обновить, и модель, которую вы отправляете для обновления, должна иметь тот же идентификатор, который вы определили как первичный ключ.
Обновление означает, что вы CarModel
который уже находится в базе данных, и после обновления этой CarModel
вы возвращаете новые значения в базу данных, кроме идентификатора, который вы возвращаете тот же Id
что делать
вам нужна, например, глобальная переменная типа CarModel
и реализовать функции набора в CarModel
В MainActivity присвойте извлеченную CarModel глобальной переменной и используйте функции set для обновления значений переменных-членов CarModel.
затем передайте эту глобальную переменную в функцию обновления в MainActivity
У меня есть пример в моем Github, как это