java - 使用 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}]
如您所见,结果似乎很复杂,但具有空值。
对此的任何帮助将不胜感激!
解决方案
推荐阅读
- ubuntu - 安装 Elementary OS 一直失败
- python - 扫描多篇存储的论文中的单词并将它们的出现(1 或 0)保存到带有 pandas 的数据框中
- sockets - 为什么我们在使用SocketActivityTrigger的时候需要事件StreamSocketListener.ConnectionReceived?
- java - 同等比较后如何删除元素?
- reactjs - 对于 React 应用程序主题,material-ui makeStyles 与 SCSS 架构相比是否有优势?
- python - 在python中为类定义参数
- exe - 无法访问 Windows Installer 服务。如果未正确安装 Windows 安装程序,则可能会发生这种情况
- nginx - 安装了多少nginx权重(不安装应用)
- variables - 使用带有 shell 变量的 find 命令不起作用(没有这样的文件或目录)
- python-3.x - 对以下代码的输出感到困惑