So i have a recyclerview with few items(meals) where a user adds from a alertdialog. When I start the app and add a meal then immediately delete it and quit the app , when starting it second time the meal i just added is loaded from the database and it was not deleted , while it must be. When i delete it the second time when it was added previously it gets deleted and not loaded again.
This is my AppDatabase.class:
@Database(entities = {FoodItem.class, FoodMenuItem.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract FoodItemDao foodItemDao();
public abstract FoodMenuItemDao foodMenuItemDao();
private static AppDatabase INSTANCE;
public static AppDatabase getInstance(Context context) {
if(INSTANCE == null){
INSTANCE = Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "DB_NAME")
.allowMainThreadQueries()
.build();
}
return INSTANCE;
}
}
This is my FoodItem.class
@Entity
public class FoodItem {
@PrimaryKey(autoGenerate = true)
public int id;
public String mealName;
public double kcal;
public double fats;
public double proteins;
public double carbs;
public String date;
public int quantity;
public FoodItem(String mealName, double kcal, double fats, double carbs, double proteins, String date) {
this.mealName = mealName;
this.kcal = kcal;
this.fats = fats;
this.carbs = carbs;
this.proteins = proteins;
this.date = date;
this.quantity = 100;
}
public int getId() {
return id;
}
public String getMealName() {
return mealName;
}
public double getKcal() {
return kcal;
}
public double getFats() {
return fats;
}
public double getProteins() {
return proteins;
}
public double getCarbs() {
return carbs;
}
public String getDate() {
return date;
}
public int getQuantity() {
return quantity;
}
public void setId(int id) {
this.id = id;
}
public void setMealName(String mealName) {
this.mealName = mealName;
}
public void setKcal(double kcal) {
this.kcal = kcal;
}
public void setFats(double fats) {
this.fats = fats;
}
public void setProteins(double proteins) {
this.proteins = proteins;
}
public void setCarbs(double carbs) {
this.carbs = carbs;
}
public void setDate(String date) {
this.date = date;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
}
These are few methods from the MealAdapter.class :
public void addMeal(FoodItem meal) {
meals.add(meal);
notifyItemInserted(meals.size() - 1);
}
public List<FoodItem> getMeals() {
return meals;
}
public MealAdapter(List<FoodItem> meals) {
this.meals = meals;
}
public FoodItem getMealAt(int position) {
return meals.get(position);
}
public void removeMeal(FoodItem foodItem) {
int position = meals.indexOf(foodItem);
if (position != -1) {
meals.remove(position);
notifyItemRemoved(position);
}
}
This is my FoodItemDao :
@Dao
public interface FoodItemDao {
@Insert
void insert(FoodItem foodItem);
@Query("SELECT * FROM FoodItem")
List<FoodItem> getAllMeals();
@Query("SELECT * FROM FoodItem")
FoodItem getMeal();
@Delete
void delete(FoodItem foodItem);
@Query("SELECT * FROM FoodItem WHERE date = :date")
List<FoodItem> getMealsByDate(String date);
@Query("DELETE FROM FoodItem WHERE date = :date")
void deleteMealsByDate(String date);
}
This is my Activity :
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_macros_calculator);
db = Room.databaseBuilder(getApplicationContext(),
AppDatabase.class, "DB_NAME").allowMainThreadQueries().build();
foodMenuItemDao = db.foodMenuItemDao();
foodItemDao = db.foodItemDao();
List<FoodItem> savedMeals = loadTodaysMealsFromDatabase();
for (FoodItem meal : savedMeals) {
mealAdapter.addMeal(meal);
}
updateTotalValues();
}
private List<FoodItem> loadTodaysMealsFromDatabase() {
String currentDate = dateFormat.format(calendar.getTime());
List<FoodItem> meals = foodItemDao.getMealsByDate(currentDate);
Log.d("Database", "Loaded meals: " + meals.size());
return meals;
}
private class SwipeToDeleteCallback extends ItemTouchHelper.SimpleCallback {
SwipeToDeleteCallback() {
super(0, ItemTouchHelper.LEFT);
}
@Override
public boolean onMove(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder, @NonNull RecyclerView.ViewHolder target) {
return false;
}
@Override
public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
int position = viewHolder.getAdapterPosition();
FoodItem deletedMeal = mealAdapter.getMeals().get(position);
deleteItem(deletedMeal);
updateTotalValues();
}
}
private void deleteItem(FoodItem foodItem) {
AppDatabase database = AppDatabase.getInstance(this.getApplicationContext());
database.foodItemDao().delete(foodItem);
Log.d("Database", "Deleted meal: " + foodItem.getMealName());
mealAdapter.removeMeal(foodItem);
mealAdapter.notifyDataSetChanged();
updateTotalValues();
}
........
builder.setPositiveButton("Add", (dialog, which) -> {
int selectedQuantity = getSelectedQuantity(radioGroupQuantities);
FoodMenuItem selectedMeal = menuAdapter.getSelectedMeal();
if (selectedMeal != null && selectedQuantity > 0) {
String currentDate = dateFormat.format(calendar.getTime());
FoodItem mealToAdd = calculateMealForQuantity(selectedMeal, selectedQuantity);
mealToAdd.setDate(currentDate);
foodItemDao.insert(mealToAdd);
mealAdapter.addMeal(mealToAdd);
updateTotalValues();
}
private void updateTotalValues() {
List<FoodItem> meals = mealAdapter.getMeals(); // Get the list of meals from the adapter
int totalKcal = 0;
double totalFats = 0;
double totalCarbs = 0;
double totalProteins = 0;
for (FoodItem meal : meals) {
totalKcal += meal.getKcal();
totalFats += meal.getFats();
totalCarbs += meal.getCarbs();
totalProteins += meal.getProteins();
}
// Update the TextView with the total values
txtViewTotal.setText("Total - " + totalKcal + "kcal " +
totalFats + "g fats " +
totalCarbs + "g carbs " +
totalProteins +"g proteins");
}