Использование MediatorLiveData для слияния с LiveData (Firestore) Потоки QuerySnapshot дают странные результаты - PullRequest
0 голосов
/ 23 мая 2018

Я назначаю два запроса Firestore для объектов LiveData.Каждый из этих запросов возвращается к различным классам объектов: User и Book.Мне нужно объединить их вместе и применить преобразование, чтобы я мог создать LinkedHashmap, который объединяет оба набора данных (запросы).Для этого я использую данные MediatorLive и для возможности слияния двух разных классов я использую QuerySnapshot в качестве типа возвращаемого значения.

Проблема, с которой я сталкиваюсь, заключается в том, что я вывожу результатыобъекта MediatorLiveData я получаю результаты дважды и составлен.Кроме того, результаты первого раза возвращают ноль для класса Book, а результаты второго раза возвращают ноль для класса 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 и связанный метод get:

    //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: НАБЛЮДАЙТЕ пользователей MERGE: [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 '}] * 10 21 * ** MainActivity: НАБЛЮДАЙТЕ MERGE books: [Book {bookAssigned = false, bookName = 'null', bookType = 'null', assignTo = 'null', bookID = 'null', groupID = 'S0Ql3hnHmXACUqeGW04n', userID = 'Otlmjxxs,' 'ulxvxxldateCreated = ср 23 мая 11: 27:20 PDT 2018, lastAssignedDate = null, bookNum = 0}]

MainActivity: НАБЛЮДАЙТЕ MERGE:false, dateCreated = null, dateModified = null, allBookID = 'null', groupID = 'S0Ql3hnHmXACUqeGW04n'}, пользователь {userID = 'OtlmIQxeLkvNYExsxjg4', userName = 'null', lastDisplayedBooks = ложный_принцип23 мая 11:27:20 PDT 2018, dateModified = null, allBookID = 'null', groupID = 'S0Ql3hnHmXACUqeGW04n'}]

MainActivity: НАБЛЮДАЙТЕ MERGE books: [Book {bookAssigned = false, bookName = 'AllКниги ', bookType =' NA ', assignTo =' Lisa ', bookID =' akuGpq7aMB85J9QMtsBi ', groupID =' S0Ql3hnHmXACUqeGW04n ', userID =' OtlmIQxeLkvNYExsxjg4 ', dateDumed_0 = 0Ned = bookyll = bookylled_eded = bookyll = bookylled_ligned_ligned_ligned_ligned_ligned_ligned_lignedtrue, bookName = 'Голодные игры', bookType = 'Мягкая обложка', назначеноTo = 'Лиза', bookID = '2D9C293DCB4469904532FF3FD81B3E7B', groupID = 'S0Ql3hnHmXACUqeGW04n', userID = 'OtlmIQYexed0PDT 2018, lastAssignedDate = ср. 23 мая 11:27:20 PDT 2018, bookNum = 1}]

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

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

...