room update (or insert if not exist) rows and return count changed rows

As @Danail Alexiev said @Insert can return a long. @Update can return an int.

But for what purpose are you using update? If you just want the whole object to be replaced by the new one then just specify the OnConflictStrategy

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(Product products);

The result will be: items that don’t exist will be added, items that already exist will be replaced by the new ones.

In the case you need to update just one param (like quantity for example) you can do something like this

  @Insert(onConflict = OnConflictStrategy.REPLACE)
  void insert(Product products);

  @Query("SELECT * from item WHERE id= :id")
  List<Product> getItemById(int id);

  @Query("UPDATE item SET quantity = quantity + 1 WHERE id = :id")
  void updateQuantity(int id)

  void insertOrUpdate(Product item) {
                List<Product> itemsFromDB = getItemById(item.getId())
                if (itemsFromDB.isEmpty())
                    insert(item)
                else
                    updateQuantity(item.getId())   
            }
        }

The result will be: Try looking up the item in the DB, if found update a property, if not just insert a new item. So you only need to call one method insertOrUpdate from your DAO.

Leave a Comment