Я назначаю два запроса Firestore объектам LiveData. Каждый из этих запросов возвращает разные классы объектов: User и Book. Мне нужно объединить их вместе и применить преобразование, чтобы я мог создать LinkedHashmap, который объединяет оба набора данных (запросов). Для этого я использую данные MediatorLive, а чтобы иметь возможность объединить два разных класса, я использую QuerySnapshot в качестве возвращаемого типа.
Проблема, с которой я сталкиваюсь, заключается в том, что когда я вывожу результаты объекта MediatorLiveData, я получаю результаты дважды и суммирую их. Кроме того, результаты первого раза возвращают значение null для класса Book, а результаты второго раза возвращают значение null для класса User.
Что мне не хватает?
Вот мой упрощенный код:
Это мои запросы Firestore и назначения 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 и ассоциированный метод получения:
//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;
}
//get method to get our merged LiveData streams
public MediatorLiveData<QuerySnapshot> getUsersBooksLiveDataMerger() {
return usersBooksLiveDataMerger();
}
А в MainActivity вот мой наблюдатель:
//Main Activity observer
mainViewModel.getUsersBooksLiveDataMerger().observe(this, new Observer<QuerySnapshot>() {
@Override
public void onChanged(@Nullable QuerySnapshot querySnapshot) {
if (querySnapshot != null) {
List<Book> books;
List<User> users;
books = querySnapshot.toObjects(Book.class);
users = querySnapshot.toObjects(User.class);
Log.d(TAG, "OBSERVE MERGE users: " + users);
Log.d(TAG, "OBSERVE MERGE books: " + books);
}
}
});
Наконец, вот мой вывод полученного слияния:
MainActivity: НАБЛЮДАЙТЕ ОБЪЕДИНЕНИЕ пользователей: [User{userID='OtlmIQxeLkvNYExsxjg4', userName='Lisa', lastDisplayedBookID='none', isAllBooks=false, dateCreated=ср 23 мая 11:27:20 PDT 2018, dateModified=ср 23 мая 11 :27:20 PDT 2018, allBookID='akuGpq7aMB85J9QMtsBi', groupID='S0Ql3hnHmXACUqeGW04n'}]
MainActivity: НАБЛЮДАТЬ ОБЪЕДИНЕНИЕ книг: [Book{bookAssigned=false, bookName='null', bookType='null',assignTo='null', bookID='null', groupID='S0Ql3hnHmXACUqeGW04n', userID='OtlmIQxeLkvNYExsxjg4', dateCreated = Среда, 23 мая, 11:27:20 PDT 2018, lastAssignedDate=null, bookNum=0}]
MainActivity: НАБЛЮДАЙТЕ ОБЪЕДИНЕНИЕ пользователей: [User{userID='OtlmIQxeLkvNYExsxjg4', userName='null', lastDisplayedBookID='null', isAllBooks=false, dateCreated=null, dateModified=null, allBookID='null', groupID='S0Ql3hnHmXACUqeGW04n' }, User{userID='OtlmIQxeLkvNYExsxjg4', userName='null', lastDisplayedBookID='null', isAllBooks=false, dateCreated=ср, 23 мая, 11:27:20 PDT 2018, dateModified=null, allBookID='null', groupID ='S0Ql3hnHmXACUqeGW04n'}]
MainActivity: НАБЛЮДАТЬ ОБЪЕДИНЕНИЕ книг: [Book{bookAssigned=false, bookName='Все книги', bookType='NA',assignTo='Lisa', bookID='akuGpq7aMB85J9QMtsBi', groupID='S0Ql3hnHmXACUqeGW04n', userID='OtlmIQxeLkvNYExsxjg4', dateCreated=null, lastAssignedDate=null, bookNum=0}, Book{bookAssigned=true, bookName='Голодные игры', bookType='Soft Cover',assignTo='Лиза', bookID='2D9C293DCB4469904532FF3FD81B3E7B', groupID='S0Ql3hnHmXACUqeGW04n' , userID='OtlmIQxeLkvNYExsxjg4', dateCreated=23 мая 11:27:20 PDT 2018, lastAssignedDate=23 мая 11:27:20 PDT 2018, bookNum=1}]
Как видите, результаты кажутся составными, но с нулевыми значениями.
Любая помощь по этому вопросу будет принята с благодарностью!