Использование MediatorLiveData для слияния с потоками LiveData (Firestore) QuerySnapshot дает странные результаты

Я назначаю два запроса 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}]

Как видите, результаты кажутся составными, но с нулевыми значениями.

Любая помощь по этому вопросу будет принята с благодарностью!


person Brian Begun    schedule 23.05.2018    source источник
comment
Я думаю, что это может иметь какое-то отношение к тому, действительно ли оба запроса обновляются одновременно. Мне нужно слушать как getUsersQuery, так и getBooksQuery, и мне нужно всегда получать результаты обоих запросов, но может срабатывать только один или другой. Мне интересно, может быть, это неправильный подход для этого.   -  person Brian Begun    schedule 24.05.2018
comment
Когда я делаю вывод Log.d() внутри методов onChanged() для каждого объекта liveData, я подтверждаю, что каждый из них отображает правильную информацию при обновлении пользователя, книги или того и другого. Я думаю, что это может подтвердить мой предыдущий комментарий о том, что если оба объекта liveData не обновляются, то другой просто вернет нулевые значения. Все еще не уверен, что решение на данный момент.   -  person Brian Begun    schedule 24.05.2018