Могу ли я наблюдать объект LiveData, который основан на запросе переменной? - PullRequest
0 голосов
/ 06 апреля 2019

В моем коде возникла проблема, которая, как я подозреваю, может быть вызвана самим собой.Поэтому я, вероятно, должен сначала ответить на этот вопрос.Могу ли я / как наблюдать объект LiveData, возвращаемый из Dao, который основан на запросе внутреннего соединения и параметре List?

К сожалению, у меня пока нет «10 репутации» в Stackoverflow, так что, очевидно,Я не могу встроить изображение.Но вот мой снимок ERD, поскольку он может помочь вам увидеть, как мои сущности связаны друг с другом: https://i.ibb.co/9YW0Vbx/Screenshot-at-2019-04-06-13-04-43.png

PrayerListFragment

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

  mTagViewModel = ViewModelProviders.of(this).get(TagViewModel.class);
  mPrayerTagViewModel = 
  ViewModelProviders.of(this).get(PrayerTagViewModel.class);
  ...
  //Update the tag list with the selected tags
  mTagViewModel.getSelectedTags().observe(this, new Observer<List<Tag>>() {
     @Override
     public void onChanged(@Nullable List<Tag> tags) {   
        if(tags.size() > 0) {      
           mPrayerTagViewModel.setTagList(tags);
        }
     }
  });

  //Observe whatever prayers the view model has to show us
  mPrayerTagViewModel.getPrayers().observe(this, new Observer<List<Prayer>>() {
     @Override
     public void onChanged(@Nullable List<Prayer> prayers) {
        mPrayersAdapter.setPrayers(prayers);
     }
  });
  ...
}

PrayerTagViewModel

...
private List<String> mTagNames = new ArrayList<>();
...
public LiveData<List<Prayer>> getPrayers() { return getPrayersForTags(mTagNames); }
...
public void setTagList(List<Tag> tags) {
   mTagNames = new ArrayList<>();
   for (Tag tag: tags) {
      mTagNames.add(tag.getName());
   }
}

ITagDAO
Возвращает объекты LiveData, которые я без проблем наблюдаю:

@Query("SELECT * FROM tag_table ORDER BY name")
LiveData<List<Tag>> getAll();

@Query("SELECT * FROM tag_table WHERE selected ORDER BY name")
LiveData<List<Tag>> getSelected();

IPrayerTagDAO
Но я сталкиваюсь с проблемами, наблюдающими это, поэтому я сначала хочу убедиться, что это правильный синтаксис:

@Query("SELECT * FROM prayer_table " +
       "INNER JOIN prayertag_table " +
       "ON summary=fk_summary " +
       "WHERE fk_name IN (:names)")
LiveData<List<Prayer>> getPrayersForTags(final List<String> names);

Если это правильный синтаксис, могу ли я потерять свой наблюдаемый в моем фрагменте, потому что вызов getPrayers() в PrayerTagViewModel возвращает новую ViewModel, т.е. другую ViewModel, чем та, которую я начал наблюдать во фрагменте ??

1 Ответ

0 голосов
/ 07 апреля 2019

Упорство окупилось!У меня было подлое подозрение, что таинственный Transformations.switchMap мог решить мою проблему, но только после гораздо большего чтения я понял, как.

PrayerTagViewModel (изменено)

...
private PrayerTagRepository mPrayerTagRepository;
private MutableLiveData<List<String>> mTags = new MutableLiveData<>();
private LiveData<List<Prayer>> mPrayers =
   Transformations.switchMap(mTags, mTags -> getPrayersForTags(mTags));

public PrayerTagViewModel(@NonNull Application application) {
   super(application);
   mPrayerTagRepository = PrayerTagRepository.getRepository(application);
}
...
public LiveData<List<Prayer>> getPrayersForTags(final List<String> names) {
   return mPrayerTagRepository.getPrayersForTags(names);
}
public LiveData<List<Prayer>> getPrayers() { return mPrayers; }
...
public void setTagList(List<Tag> tags) {
   List<String> tagNames = new ArrayList<>();
   for (Tag tag: tags)
      tagNames.add(tag.getName());
   mTags.setValue(tagNames);
}

PrayersListFragment (изменено)

...
//Update the tag list with the selected tags
mTagViewModel.getSelectedTags().observe(this, new Observer<List<Tag>>() {
   @Override
   public void onChanged(@Nullable List<Tag> tags) {
      Log.i(this.getClass().getName(),"onChanged :: Tag size = " + tags.size());
      if(tags.size() > 0)
         mPrayerTagViewModel.setTagList(tags);
   }
});

//Observe whatever prayers the view model has to show us
mPrayerTagViewModel.getPrayers().observe(this,
   prayers -> mPrayersAdapter.setPrayers(prayers));

Решение: Команда switchMap позволяет моему фрагменту наблюдать динамически изменяющиеся LiveData (фактически MutableLiveData) из моей ViewModel.

...