почему метод наблюдения данных в реальном времени не вызывается? - PullRequest
0 голосов
/ 17 октября 2018

Я использую Room и aliveata в своем приложении для Android, но я не могу получить данные внутри Liveata, и я стараюсь все.последний способ заключался в использовании метода наблюдения, который дает мне список, но этот метод не вызывается, как я могу это решить?

это мой интерфейс 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 голосов
/ 17 октября 2018

Что, если вы прямо так используете в 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);
            }
        }
    });
...