2017-10-05 12 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을 사용하여 청취해야 할 친구를 추적 할 수 있습니다.

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; 
      } 
     } 
     } 
    }); 

참고이 실제로 좋은 생각되지 않을 수 있지만, : 당신이 그럼 당신이 뭔가를 등록 할 수있는이

Map<String, ListenerRegistration> friendListeners = new HashMap<>(); 

같은 친구 리스너 등록의지도를 유지하는 경우

는 상상 . friend_list 문서에 충분한 정보를 넣는 것이 더 나을 것입니다. 실제로는 친구의 세부 정보를 조사한 후에 실제 친구 사용자 문서를로드하면됩니다.

관련 문제