首页 > 解决方案 > 为什么不调用实时数据观察方法?

问题描述

我在我的 android 应用程序中使用 Room 和 livedata,但我无法在 livedata 中获取数据,我尝试了每一件事。最后一种方法是使用给我一个列表的观察方法,但没有调用这个方法,我该如何解决这个问题?

这是我的道界面

@Dao
public interface QuestionTemplateDao {

    @Query("SELECT question_template_table.ID,question_template_table.Text,question_template_table.FieldNo from question_template_table where question_template_table.FieldNo = :fieldNO")
    LiveData<List<QuestionTemplate>> getTemplate(int fieldNO);

}

这是我的回购

public LiveData<List<QuestionTemplate>> getmAllQuestionTemplates(int field) {
        if(questionTemplateDao==null)
            questionTemplateDao=db.questionTemplateDao();
        mQuestionTemplates=questionTemplateDao.getTemplate(field);
        return mQuestionTemplates;
    }

这是视图模型

templateLiveData = mRepository.getmAllQuestionTemplates(selectedField);
        templateList = new ArrayList<>();
        templateLiveData.observe(activity, new Observer<List<QuestionTemplate>>() {
            @Override
            public void onChanged(@Nullable List<QuestionTemplate> questionTemplates) {
                Log.e("onChanged","onChanged");
                if (questionTemplates != null) {
                    templateList.addAll(questionTemplates);
                }
            }
        });

标签: androidandroid-roomandroid-livedata

解决方案


如果你直接这样使用怎么办ViewModel

templateList = new ArrayList<>();
mRepository
    .getmAllQuestionTemplates(selectedField)
    .observe(activity, new Observer<List<QuestionTemplate>>() {
        @Override
        public void onChanged(@Nullable List<QuestionTemplate> questionTemplates) {
            Log.e("onChanged","onChanged");
            if (questionTemplates != null) {
                templateList.addAll(questionTemplates);
            }
        }
    });

不需要取 in 的新对象LiveDataViewModel也可以直接从LiveData返回给你的那个中观察。


编辑:

检查另一种解决方法,

你的 DAO 会是这样的:

@Dao
public interface QuestionTemplateDao {

    @Query("SELECT question_template_table.ID,question_template_table.Text,question_template_table.FieldNo from question_template_table where question_template_table.FieldNo = :fieldNO")
    List<QuestionTemplate> getTemplate(int fieldNO);

}

您的存储库,

public void getmAllQuestionTemplates(int field, MutableLiveData<List<QuestionTemplate>> liveData) {
    if(questionTemplateDao==null)
        questionTemplateDao=db.questionTemplateDao();
    liveData.setValue(questionTemplateDao.getTemplate(field));
}

你的视图模型,

mRepository.getmAllQuestionTemplates(selectedField, (MutableLiveData<List<QuestionTemplate>>) templateLiveData);
templateList = new ArrayList<>();
templateLiveData.observe(activity, new Observer<List<QuestionTemplate>>() {
        @Override
        public void onChanged(@Nullable List<QuestionTemplate> questionTemplates) {
            Log.e("onChanged","onChanged");
            if (questionTemplates != null) {
                templateList.addAll(questionTemplates);
            }
        }
    });

推荐阅读