Android Room persistence library @Update not working
Solution 1
I am sorry for posting this as an answer but I am not allowed to add a simple comment yet so here is my idea:
Have you tried using only insertCars()
instead of updateCars()
?
Anyway it looks like your isCarsEmpty()
LiveData callback gets triggered the whole time because when the observer is called the Database is altered again.. I am not quite sure what you want to accomplish tho.
Solution 2
Make sure the row you want to updated and model you are sending to update should have same id which you have defined as primary key.
![nAkhmedov](https://i.stack.imgur.com/pVMAv.jpg?s=256&g=1)
nAkhmedov
I am an Android Engineer and loving writing enthusiastic applications. I have a Bachelor Degree of Tashkent University of Information Technologies on Computer Science.
Updated on June 07, 2022Comments
-
nAkhmedov about 2 years
I am trying to update my database via new android room library, but it is not working. Here it is my approach
@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();
I did debugging, new data comes and calling viewModel.updateItems(list) method.Thanks in advance!