我有两个收藏:用户和书籍。无论是更新用户还是书籍,我都需要获取它们的结果,然后将结果合并到LinkedHashMap中,用作ListView菜单。
我认为中介LiveData是可行的,但是如果我将用户查询和图书查询放在其中,那么两个LiveData对象中的一个将得到空值,因为只有一个或其他对象触发。我想如果其中一个触发了,那么可能我在mediatorLiveData中的每个addSource()内部都运行了一个查询,但是我不确定这是否是解决问题的方法。
我关于mediatorlivedata的帖子如下:
Using MediatorLiveData to merge to LiveData (Firestore) QuerySnapshot streams is producing weird results
我的两个查询和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)
return query;
}
private FirebaseQueryLiveData booksLiveData = new FirebaseQueryLiveData(getBooksQuery());
不知何故,当用户更新时,我也需要获取书籍的数据,然后合并它们,但如果书籍更新,然后获取用户的数据并合并它们,我也需要这样做。
任何想法都会受到极大的赞赏。
附加说明/观察
好吧,所以我不完全排除中介LiveData对象。当然,它允许我在同一个方法中监听两个不同的LiveData对象,但是,我不想直接合并这两个对象,因为我需要单独处理每个LiveData对象。例如:userslivedata触发是因为我们创建或修改了一个用户,然后我需要查询书籍,获取结果,并合并用户和书籍等。
以下是我目前的mediatorlivedata:
//MediatorLiveData merge two LiveData QuerySnapshot streams
private MediatorLiveData<QuerySnapshot> usersBooksLiveDataMerger() {
final MediatorLiveData<QuerySnapshot> mediatorLiveData = new MediatorLiveData<>();
mediatorLiveData.addSource(usersLiveData, new Observer<QuerySnapshot>() {
@Override
public void onChanged(@Nullable QuerySnapshot querySnapshot) {
mediatorLiveData.setValue(querySnapshot);
}
});
mediatorLiveData.addSource(booksLiveData, new Observer<QuerySnapshot>() {
@Override
public void onChanged(@Nullable QuerySnapshot querySnapshot) {
mediatorLiveData.setValue(querySnapshot);
}
});
return mediatorLiveData;
}
现在它返回另一个LiveData源的空结果。相反,我需要查询然后合并。有什么办法吗?在这件事上没有太多。
我尝试将一个查询放入一个使用transforms.map()调用的函数中,但是由于它是异步调用,所以在查询完成之前调用返回语句。
以下是我对该功能的尝试:
private class ListenUsersGetBooks implements Function<QuerySnapshot, LinkedHashMap<User, List<Book>>> {
@Override
public LinkedHashMap<User, List<Book>> apply(final QuerySnapshot input) {
userBookList = new LinkedHashMap<>();
getBooksQuery().get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
List<User> users = input.toObjects(User.class);
List<Book> books = task.getResult().toObjects(Book.class);
Log.d(TAG, "USERLIST! " + users);
Log.d(TAG, "BOOKLIST! " + books);
for (User user : users) {
bookList = new ArrayList<>();
for (Book book : books) {
if (user.getUserID().equals(book.getUserID())
&& book.getBookAssigned()) {
bookList.add(book);
}
else if (user.getAllBookID().equals(book.getBookID())) {
bookList.add(book);
}
}
userBookList.put(user, bookList);
}
Log.d(TAG,"OBSERVE userBookList: " + userBookList);
}
});
return userBookList;
}
}