Cloud Firestore - 从多个位置获取文档

时间:2017-10-05 11:58:27

标签: java android firebase google-cloud-firestore

当用户在我的应用中检查他的朋友列表时,我希望该应用通过列表中的每个用户,并从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();

                }

这是我想要的过程的一个例子:

enter image description here

正如您所看到的,我可以通过这种方式获取每个用户的信息,但我无法找到一种方法来听取此过程,并在获得有关所有朋友的信息时继续在用户列表中。

这是我能够立即获取所有朋友信息的方式吗?

1 个答案:

答案 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文档中,只需在实际深入了解该朋友的详细信息后加载实际的朋友用户文档。