Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Room persistence library @Update not working

Tags:

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!

like image 684
nAkhmedov Avatar asked Jul 25 '17 09:07

nAkhmedov


People also ask

What is room persistence library?

The Room persistence library provides an abstraction layer over SQLite to allow for more robust database access while harnessing the full power of SQLite. Latest Update.

What is Roomdatabase?

Room is a persistence library that provides an abstraction layer over the SQLite database to allow a more robust database. With the help of room, we can easily create the database and perform CRUD operations very easily.

Which library will help you asynchronously manage this data?

The Room library includes integrations with several different frameworks to provide asynchronous query execution.


2 Answers

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.

like image 67
Kimmi Dhingra Avatar answered Oct 12 '22 10:10

Kimmi Dhingra


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.

like image 43
maperz Avatar answered Oct 12 '22 10:10

maperz