Android Room persistence library @Update not working

14,174

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.

Share:
14,174
nAkhmedov
Author by

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, 2022

Comments

  • nAkhmedov
    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!