【问题标题】:Can I observe a LiveData object that is based on a variable query?我可以观察基于变量查询的 LiveData 对象吗?
【发布时间】:2019-04-06 17:25:10
【问题描述】:

我的代码遇到了我怀疑可能是自己造成的问题。所以我应该先回答这个问题。我可以/如何观察从基于内部连接查询和 List 参数的 Dao 返回的 LiveData 对象吗?

不幸的是,我在 Stackoverflow 上还没有“10 声望”,所以显然我无法嵌入图像。但这是我的 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);

如果它是有效的语法,我是否可能会在我的片段中丢失我的 observable,因为在 PrayerTagViewModel 中对 getPrayers() 的调用会返回一个新的 ViewModel,即与我在片段中开始观察的 ViewModel 不同的 ViewModel??

p>

【问题讨论】:

    标签: sqlite android-room android-viewmodel


    【解决方案1】:

    坚持有回报!我偷偷地怀疑神秘的 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 让我的 Fragment 从我的 ViewModel 观察动态变化的 LiveData(实际上是 MutableLiveData)。

    【讨论】:

      猜你喜欢
      • 2011-06-17
      • 2016-02-07
      • 1970-01-01
      • 2020-08-05
      • 1970-01-01
      • 2019-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多