当用户在我的应用中检查他的朋友列表时,我希望该应用通过列表中的每个用户,并从Cloud Firestore
检索最新信息。
这是我目前的代码:
final CollectionReference usersRef= FirebaseFirestore.getInstance().collection("users");
usersRef.document(loggedEmail).collection("friends_list").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot documentSnapshots) {
if (!documentSnapshots.isEmpty()){
for (DocumentSnapshot friendDocument: documentSnapshots) {
usersRef.document(friendDocument.getString("email")).get().addOnSuccessListener
(new OnSuccessListener<DocumentSnapshot>() {
@Override
public void onSuccess(DocumentSnapshot documentSnapshot) {
User friend=documentSnapshot.toObject(User.class);
friendsList_UserList.add(friend);
}
});
}
///...
}
else
noFriendsFound();
}
这是我想要的过程的一个例子:
正如您所看到的,我可以通过这种方式获取每个用户的信息,但我无法找到一种方法来听取此过程,并在获得有关所有朋友的信息时继续在用户列表中。
这是我能够立即获取所有朋友信息的方式吗?
答案 0 :(得分:2)
Firestore不直接支持您要求的联接。
您可以使用QuerySnapshot
中的getDocumentChanges
构建一个链式侦听器,以跟踪您应该收听哪些朋友。
想象一下,如果你保留了这样的朋友监听器注册地图
Map<String, ListenerRegistration> friendListeners = new HashMap<>();
然后你可以注册这样的东西:
usersRef.document(loggedEmail).collection("friends_list")
.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(QuerySnapshot snapshot, FirebaseFirestoreException error) {
for (DocumentChange change : snapshot.getDocumentChanges()) {
DocumentSnapshot friend = change.getDocument();
String friendId = friend.getId();
ListenerRegistration registration;
switch (change.getType()) {
case ADDED:
case MODIFIED:
if (!friendListeners.containsKey(friendId)) {
registration = usersRef.document(friendId).addSnapshotListener(null);
friendListeners.put(friendId, registration);
}
break;
case REMOVED:
registration = friendListeners.get(friendId);
if (registration != null) {
registration.remove();
friendListeners.remove(friendId);
}
break;
}
}
}
});
请注意,这可能实际上并不是一个好主意。您可能最好将足够的信息下载到friends_list文档中,只需在实际深入了解该朋友的详细信息后加载实际的朋友用户文档。