首页 > 解决方案 > 使用 MediatorLiveData 合并到 LiveData (Firestore) QuerySnapshot 流会产生奇怪的结果

问题描述

我将两个 Firestore 查询分配给 LiveData 对象。这些查询中的每一个都返回不同的对象类:用户和图书。我需要将它们合并在一起并应用转换,以便我可以创建一个 LinkedHashmap 结合两组数据(查询)。为了做到这一点,我使用 MediatorLive 数据并能够合并两个不同的类,我使用 QuerySnapshot 作为返回类型。

我遇到的问题是当我输出 MediatorLiveData 对象的结果时,我得到了两次结果并复合了。此外,Book 类的第一次结果返回 null,而 User 类的第二次结果返回 null。

我错过了什么?

这是我的代码简化:

这些是我的 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=2018 年 5 月 23 日星期三 11:27:20 PDT,dateModified=11 年 5 月 23 日星期三:27:20 PDT 2018, allBookID='akuGpq7aMB85J9QMtsBi', groupID='S0Ql3hnHmXACUqeGW04n'}]

MainActivity:观察合并书籍:[Book{bookAssigned=false, bookName='null', bookType='null', assignedTo='null', bookID='null', groupID='S0Ql3hnHmXACUqeGW04n', userID='OtlmIQxeLkvNYExsxjg4', dateCreated =2018 年 5 月 23 日星期三 11:27:20 PDT,lastAssignedDate=null,bookNum=0}]

MainActivity:观察合并用户:[User{userID='OtlmIQxeLkvNYExsxjg4', userName='null', lastDisplayedBookID='null', isAllBooks=false, dateCreated=null, dateModified=null, allBookID='null', groupID='S0Ql3hnHmXACUqeGW04n' },用户 {userID='OtlmIQxeLkvNYExsxjg4',userName='null',lastDisplayedBookID='null',isAllBooks=false,dateCreated=2018 年 5 月 23 日星期三 11:27:20 PDT,dateModified=null,allBookID='null',groupID ='S0Ql3hnHmXACUqeGW04n'}]

MainActivity:观察合并书籍:[Book{bookAssigned=false, bookName='All Books', bookType='NA', assignedTo='Lisa', bookID='akuGpq7aMB85J9QMtsBi', groupID='S0Ql3hnHmXACUqeGW04n', userID='OtlmIQxeLkvNYExsxjg4', dateCreated=null, lastAssignedDate=null, bookNum=0}, Book{bookAssigned=true, bookName='Hunger Games', bookType='Soft Cover', assignedTo='Lisa', bookID='2D9C293DCB4469904532FF3FD81B3E7B', groupID='S0Ql3hnHmXACUqeGW04n' ,用户 ID='OtlmIQxeLkvNYExsxjg4',dateCreated=2018 年 5 月 23 日星期三 11:27:20 PDT,lastAssignedDate=2018 年 5 月 23 日星期三 11:27:20 PDT,bookNum=1}]

如您所见,结果似乎很复杂,但具有空值。

对此的任何帮助将不胜感激!

标签: javaandroidfirebasegoogle-cloud-firestoreandroid-livedata

解决方案


推荐阅读