4

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

                }

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

在此处输入图像描述

如您所见,我可以通过这种方式获取每个用户的信息,但是我无法找到监听此过程的方法,并在我掌握了用户列表中所有朋友的信息时继续进行。

我可以一次获得所有朋友信息的方式吗?

4

1 回答 1

2

Firestore 不直接支持您要求的连接。

getDocumentChanges您可以使用in构造一个链式侦听器QuerySnapshot来跟踪您应该听哪些朋友。

想象一下,如果您像这样保留朋友听众注册的地图

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 文档中,这样您只需在实际深入了解该朋友的详细信息时才需要加载实际的朋友用户文档。

于 2017-10-05T18:55:19.670 回答