【发布时间】: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