Java 使用MediatorLiveData合并到LiveData(Firestore)QuerySnapshot流会产生奇怪的结果
我正在为LiveData对象分配两个Firestore查询。这些查询中的每一个都返回到不同的对象类:User和Book。我需要将它们合并在一起并应用一个转换,这样我就可以创建一个LinkedHashmap来组合这两组数据(查询)。为了做到这一点,我使用MediatorLive数据并能够合并两个不同的类,我使用QuerySnapshot作为返回类型 我遇到的问题是,当我输出MediatorLiveData对象的结果时,我会得到两次结果并进行复合。此外,第一次结果为Book类返回null,第二次结果为User类返回null 我错过了什么 以下是我的简化代码: 以下是我的Firestore查询和LiveData分配: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,第二次结果
//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对象都在更新,否则另一个对象只会返回空值。目前仍不确定解决方案是什么。