我有两个集合:用户和书籍。无论用户或书籍是否更新,我都需要获取它们的结果,然后将结果合并到 LinkedHashMap 中以用作 listView 菜单。
我认为 MediatorLiveData 将是可行的方法,但是如果我将用户查询和书籍查询放入,那么我会从两个 LiveData 对象之一中获取空值,因为只有一个或另一个触发。我想也许如果其中一个触发,那么也许我在 MediatorLiveData 的每个 addSource() 中运行了一个查询,但我不确定这是否可行。
我的关于 MediatorLiveData 的帖子在这里: 使用 MediatorLiveData 合并到 LiveData (Firestore) QuerySnapshot 流正在产生奇怪的结果
我的两个查询和 LiveData 对象如下:
//getUsers query using FirebaseQueryLiveData class
private Query getUsersQuery() {
FirebaseAuth mAuth = FirebaseAuth.getInstance();
adminID = mAuth.getUid();
query = FirebaseFirestore.getInstance().collection("admins")
.document(adminID)
.collection("users")
return query;
}
private FirebaseQueryLiveData usersLiveData = new FirebaseQueryLiveData(getUsersQuery());
//getBooks query using FirebaseQueryLiveData class
private Query getBooksQuery () {
FirebaseGroupID firebaseGroupID = new FirebaseGroupID(getApplication());
groupID = firebaseGroupID.getGroupID();
query = FirebaseFirestore.getInstance().collection("books")
.whereEqualTo("groupID", groupID) …Run Code Online (Sandbox Code Playgroud) android firebase android-livedata android-architecture-components google-cloud-firestore
不知道发生了什么。我正在运行两个查询,然后使用 MediatorLiveData 和 Transformations.map 合并和转换这些查询。我将这个几乎完全相同的代码用于其他两个查询,没有问题。但是当我将它用于这些特定查询时,应用程序一开始就会崩溃,并出现以下错误。
请注意:我已经尝试观察 MediatorLiveData,并且可以毫无错误地获得两个查询的结果。只有当我尝试通过 Transformations.map 运行它们时,才会出现错误和应用程序崩溃。
这是我用来测试运行良好的 MediatorLiveData 的观察:
viewModel.getAllValidEventsLiveDataMerger().observe(this, new Observer<AllValidEventsSnapshot>() {
@Override
public void onChanged(@Nullable AllValidEventsSnapshot allValidEventsSnapshot) {
if (allValidEventsSnapshot.isComplete()) {
List<Event> nonRepeatEventList;
List<Event> repeatEventList;
List<Event> eventList = new ArrayList<>();
nonRepeatEventList = allValidEventsSnapshot.getValidNonRepeatableEventsSnapshot().toObjects(Event.class);
repeatEventList = allValidEventsSnapshot.getValidRepeatableEventsSnapshot().toObjects(Event.class);
eventList.addAll(nonRepeatEventList);
eventList.addAll(repeatEventList);
Log.d(TAG, "EVENTLIST: " + eventList.toString());
}
}
});
Run Code Online (Sandbox Code Playgroud)
这是通过 Transformations.map 的观察:
viewModel.getAllValidEventsLiveData().observe(this, new Observer<List<Event>>() {
@Override
public void onChanged(@Nullable List<Event> eventList) {
if (eventList != null) {
Log.d(TAG, "EventList: " + eventList.toString());
}
}
});
Run Code Online (Sandbox Code Playgroud)
这是代码:
视图模型.java …
android android-architecture-components google-cloud-firestore