2017-10-05 58 views
4

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

正如你看到的,我可以得到每个用户的信息这样,但我找不到方法来听这个过程,并继续,当我有关于用户的列表中的所有朋友的信息。

是我能一次获得所有朋友信息的一种方式吗?

回答

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

相关问题