首页 > 解决方案 > 如何通过存储库将视图模型中的参数传递给 Dao

问题描述

我正在创建具有以下架构的应用程序:房间数据库 <-> 存储库 <-> 视图模型 <-> 片段。我想要实现的是通过带有一些给定变量的 Dao 对象通过 Repository 从 View Model 执行查询。我创建了用于从 Dao 对象的表中选择一些数据的查询:

@Query("SELECT * FROM meal_table WHERE mealDate = :date") 
public LiveData<MealWithProducts> getMealWithProductsFromDate(String date);

然后我在 Repository 类中设置了固定值用于测试目的,例如:

MealWithProductsRepository.class

public class MealWithProductsRepository {

    private final MealWithProductsDao mealWithProductsDao;
    private final LiveData<MealWithProducts> mealWithProductsFromDate;

    public MealWithProductsRepository(Application application){
        AppDatabase db = AppDatabase.getDatabase(application);
        mealWithProductsDao = db.mealWithProductsDao();
        mealWithProductsFromDate = mealWithProductsDao.getMealWithProductsFromDate("15-08-2021");
    }

    public LiveData<MealWithProducts> getMealWithProductsFromDate() {
        return mealWithProductsFromDate;
    }

}

DiaryEntryViewModel.class

public class DiaryEntryViewModel extends AndroidViewModel {

    private final MealWithProductsRepository mealWithProductsRepository;
    private final LiveData<MealWithProducts> mealWithProductsFromDate;


    public DiaryEntryViewModel(@NonNull Application application) {
        super(application);

        mealWithProductsRepository = new MealWithProductsRepository(application);
        mealWithProductsFromDate = mealWithProductsRepository.getMealWithProductsFromDate();
    }

    public LiveData<MealWithProducts> getMealWithProductsFromDate() { return mealWithProductsFromDate; }


}

我已经测试了这个单一案例并且它有效,但是我不知道如何将参数从 View Model 类传递到存储库,因为这个查询是在 Repository 构造函数中执行的,并且 View Model 中的 Repository 引用是在 View Model 构造函数中创建的。请您指出我应该如何进一步处理这个问题的方向。提前致谢!

标签: androidandroid-roomandroid-jetpackandroid-viewmodel

解决方案


public class DiaryEntryViewModel extends AndroidViewModel {

    private final MealWithProductsRepository mealWithProductsRepository;
    private final LiveData<MealWithProducts> mealWithProductsFromDate;


    public DiaryEntryViewModel(@NonNull Application application) {
        super(application);

        mealWithProductsRepository = new MealWithProductsRepository(application);
    }

    public LiveData<MealWithProducts> getMealWithProductsFromDate(String date) { return mealWithProductsRepository.getMealWithProductsFromDate(); }


}
public class MealWithProductsRepository {

    private final MealWithProductsDao mealWithProductsDao;
    private final LiveData<MealWithProducts> mealWithProductsFromDate;

    public MealWithProductsRepository(Application application){
        AppDatabase db = AppDatabase.getDatabase(application);
        mealWithProductsDao = db.mealWithProductsDao();
    }

    public LiveData<MealWithProducts> getMealWithProductsFromDate(String date) {
        return mealWithProductsDao.getMealWithProductsFromDate(date);
    }

}

@Query("SELECT * FROM meal_table WHERE mealDate = :date") 
public LiveData<MealWithProducts> getMealWithProductsFromDate(String date);

你为什么不这样使用?


推荐阅读