У меня есть две коллекции: пользователи и книги.Мне нужно получить результаты обоих из них, независимо от того, обновлены ли пользователи или книги, а затем объединить результаты вместе в LinkedHashMap для использования в качестве меню listView.
Я думал, что MediatorLiveData будет подходить, ноесли я помещу запрос Users и Query of Books в то, я получаю нулевое значение от одного из двух объектов LiveData, потому что срабатывает только один или другой.Я подумал, может быть, если один из них сработает, тогда, возможно, у меня есть запрос, запускаемый внутри каждого addSource () в MediatorLiveData, но я не уверен, что это путь.
Мой пост, касающийся 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)
return query;
}
private FirebaseQueryLiveData booksLiveData = new FirebaseQueryLiveData(getBooksQuery());
Почему-то, когдаПользователи обновляются, мне нужно также получать данные Книг, а затем объединять их, но мне также нужно, чтобы это происходило, если Книги обновляют, а затем получают данные Пользователей и объединяют их.
Любые идеи будут в значительной степениприветствуется.
Дополнительное примечание / наблюдение Хорошо, поэтому я не полностью исключаю объект MediatorLiveData.Конечно, это позволяет мне прослушивать два разных объекта 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.Вместо этого мне нужно запросить затем объединить.Есть идеи, как это сделать?В этом нет ничего особенного.
Я пытался поместить запрос в функцию, которая вызывается с использованием Transformations.map (), но из-за асинхронного вызова оператор return выполняетсяВызван до завершения запроса.
Вот моя попытка функции:
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;
}
}