我可以使用Tasks将Firestore get()命令链接在一起,但是我想使用Firestore的onSnapshotListener进行相同操作,这样我就可以将实时更新链接在一起。
以下是我用来链接多个获得奖励的代码示例:
Query usersQuery = mDbase.collection("admins").document(adminID).collection("users");
Query booksQuery = mDbase.collection("books").whereEqualTo("groupID", groupID);
DocumentReference adminDoc = mDbase.collection("admins").document(adminID);
final Task<QuerySnapshot> getUsers = usersQuery.get();
final Task<QuerySnapshot> getBooks = booksQuery.get();
final Task<DocumentSnapshot> getAdmin = adminDoc.get();
Tasks.whenAllSuccess(getUsers, getBooks, getAdmin)
.addOnCompleteListener(new OnCompleteListener<List<Object>>() {
@Override
public void onComplete(@NonNull Task<List<Object>> task) {
List<User> users = getUsers.getResult().toObjects(User.class);
List<Book> books = getBooks.getResult().toObjects(Book.class);
Admin admin = getAdmin.getResult().toObject(Admin.class);
// ...
}
});
我的目标如下:“(我)想要将三个单独的快照侦听器视为单个”流“,并且每当在其中任何一个中触发事件时,(I)希望获得具有最新值的更新所有这三个。”报价和示例代码由Sam Stern在Google Firestore论坛中提供。
出于我的目的,听起来我需要实时更新。
这是我的嵌套快照代码:
firebaseGetUsers.readDataRTUpdate(new FirebaseGetUsers.FirestoreCallback() {
@Override
public void onCallback(final List<User> users) {
firebaseGetBooks.readDataRTUpdate(new FirebaseGetBooks.FirestoreCallback() {
@Override
public void onCallback(final List<Book> books) {
firebaseGetThisAdmin.readDataRTUpdate(new FirebaseGetThisAdmin.FirestoreCallback() {
@Override
public void onCallback(Admin admin) {
//processing all code here.
//books are empty!!
System.out.println("books: " + books.toString());
}
}
});
}
});
}
});
感谢。
答案 0 :(得分:0)
您所询问的内容对于快照侦听器来说并不可行。任务表示最终以最终结果或某些错误完成的工作单元。它们不适合正在进行的工作或流数据,因为从来没有一个最终的结果。相反,您注册一个为每个更新调用的侦听器,该更新仅在您选择停止它时停止。所以,无论你想做什么,你都必须编写管理监听器而不是任务的代码。