为什么不调用实时数据观察方法?

时间:2018-10-17 13:09:52

标签: android android-room android-livedata

我在Android应用中使用Room和livedata,但无法在livedata中获取数据,因此我尝试了一切。最后一种方法是使用observe方法给我一个列表,但是没有调用此方法,我该如何解决?

这是我的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")
    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;
    }

这是viewModel

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);
                }
            }
        });

1 个答案:

答案 0 :(得分:1)

如果您在 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);
            }
        }
    });

无需在LiveData中使用ViewModel的新对象,您还可以直接从返回的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));
}

您的ViewModel,

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);
            }
        }
    });