【问题标题】:How can I pass parameters from View Model via Repository to the Dao如何通过存储库将视图模型中的参数传递给 Dao
【发布时间】:2021-08-15 23:32:33
【问题描述】:

我正在创建具有以下架构的应用程序:房间数据库 存储库 视图模型 片段。我想要实现的是通过带有一些给定变量的 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 中创建的构造函数。请您指出我应该如何进一步处理这个问题的方向。提前致谢!

【问题讨论】:

    标签: android android-room android-jetpack android-viewmodel


    【解决方案1】:
    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);
    

    你为什么不这样使用?

    【讨论】:

    • 谢谢古拉布。我觉得这太简单了:)我觉得我陷入了过于密切关注教程的陷阱,最终导致了对问题的狭隘看法。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多