Java 使用MediatorLiveData合并到LiveData(Firestore)QuerySnapshot流会产生奇怪的结果

Java 使用MediatorLiveData合并到LiveData(Firestore)QuerySnapshot流会产生奇怪的结果,java,android,firebase,google-cloud-firestore,android-livedata,Java,Android,Firebase,Google Cloud Firestore,Android Livedata,我正在为LiveData对象分配两个Firestore查询。这些查询中的每一个都返回到不同的对象类:User和Book。我需要将它们合并在一起并应用一个转换,这样我就可以创建一个LinkedHashmap来组合这两组数据(查询)。为了做到这一点,我使用MediatorLive数据并能够合并两个不同的类,我使用QuerySnapshot作为返回类型 我遇到的问题是,当我输出MediatorLiveData对象的结果时,我会得到两次结果并进行复合。此外,第一次结果为Book类返回null,第二次结果

我正在为LiveData对象分配两个Firestore查询。这些查询中的每一个都返回到不同的对象类:User和Book。我需要将它们合并在一起并应用一个转换,这样我就可以创建一个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和associate 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();
    } 
//MediatorLiveData合并两个LiveData查询快照流
私有中介LiveData UsersBooksLiveDataMerge(){
final MediatorLiveData MediatorLiveData=new MediatorLiveData();
mediatorLiveData.addSource(usersLiveData,newobserver()){
@凌驾
更改后的公共无效(@Nullable QuerySnapshot QuerySnapshot){
mediatorLiveData.setValue(querySnapshot);
}
});
mediatorLiveData.addSource(booksLiveData,newobserver()){
@凌驾
更改后的公共无效(@Nullable QuerySnapshot QuerySnapshot){
mediatorLiveData.setValue(querySnapshot);
}
});
返回数据;
}
//get方法来获取合并的LiveData流
公共中介LiveData GetUsersBooksLiveDataMerge(){
返回usersbookslivedatamerge();
} 
在主要活动中,我的观察者:

    //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);
                }
            }
        }); 
//主要活动观察者
mainViewModel.GetUsersBooksLiveDataMerge().observe(这是一个新的观察者(){
@凌驾
更改后的公共无效(@Nullable QuerySnapshot QuerySnapshot){
if(querySnapshot!=null){
列出书籍;
列出用户名单;
books=querySnapshot.toObjects(Book.class);
users=querySnapshot.toObjects(User.class);
Log.d(标记“观察合并用户:”+用户);
Log.d(标记“观察合并书籍:+书籍”);
}
}
}); 
最后,这里是结果合并的输出:

主要活动:观察合并用户:[用户{userID='OtlmIQxeLkvNYExsxjg4',userName='Lisa',lastDisplayedBookID='none',isAllBooks=false,dateCreated=Wed May 23 11:27:20 PDT 2018,dateModified=Wed May 23 11:27:20 PDT 2018,allBookID='akuGpq7aMB85J9QMtsBi',groupID='S0ql3hnmxaucqegw04n']

主要活动:观察合并账簿:[Book{bookAssigned=false,bookName='null',bookType='null',assignedTo='null',bookID='null',groupID='S0Ql3hnHmXACUqeGW04n',userID='OtlmIQxeLkvNYExsxjg4',dateCreated=Wed May 23 11:27:20 PDT 2018,lastAssignedDate=null,bookNum=0}]

MainActivity:观察合并用户:[用户{userID='OtlmIQxeLkvNYExsxjg4',userName='null',lastDisplayedBookID='null',isAllBooks=false,dateCreated=null,dateModified=null,allBookID='null',groupID='s0ql3hnmxacuqegw04n',用户{userID='OtlmIQxeLkvNYExsxjg4',userName='null',lastDisplayedBookID='null',isAllBooks=false,dateCreated=Wed May 23 11:27:20 PDT 2018,dateModified=null,allBookID='null',groupID='S0Ql3hnHmXACUqeGW04n'}]

主要活动:观察合并图书:[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='2D9C293DCB44690432FF3FD81B3E7B',groupID='S0QL3HmXacuqeGW04N',userID='OtlmIQxeLkvNYExsxjg4',dateCreated=2018年5月23日星期三11:27:20,lastAssignedDate=2018年5月23日11:27:20,bookNum=1}]

如您所见,结果似乎是复合的,但具有空值


如果您能在这方面提供任何帮助,我们将不胜感激。

我认为这可能与两个查询是否同时更新有关。我需要同时收听getUsersQuery和getBooksQuery,并且我需要始终获得两个查询的结果,但只有一个或另一个查询可能会触发。我想这可能不是正确的方法当我在onChanged()中执行Log.d()输出时每个liveData对象的方法我确认在更新用户或书籍或两者时,它们都显示了正确的信息。我认为这可能证实了我之前的评论,即除非两个liveData对象都在更新,否则另一个对象只会返回空值。目前仍不确定解决方案是什么。