2016-08-16 4 views
19

나는이 중포 기지 데이터베이스firebase 데이터베이스에서 모든 하위 데이터를 가져 오는 방법은 무엇입니까?

enter image description here

하고 난 내가 모든 childes를 얻기 위해 사용된다 리스너 사용자의 모든 전화 번호를 얻을 필요가?

모든 사용자가 해당 개체의 이름으로 사용자 ID를 가진 개체로 추가되고, 나는 그것이 DataSnapshot에 관련이 이것이 내가 문서를 검색하는 사용자 ID

을 모른 채 개체를 검색해야하지만 난 나오지 않았어 청취자없이 DataSnapshot을 얻지 못했습니다! DataSnapshout을 찾는 것이 맞습니까? 아니면 다른 것을 사용해야합니까?

답변

26

먼저 datasnapshot 사용자를 검색하십시오.

//Get datasnapshot at your "users" root node 
    DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users"); 
    ref.addListenerForSingleValueEvent(
      new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        //Get map of users in datasnapshot 
        collectPhoneNumbers((Map<String,Object>) dataSnapshot.getValue()); 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 
        //handle databaseError 
       } 
      }); 

그런 다음 사용자를 둘러보고지도에 액세스하고 전화 필드를 수집합니다.

private void collectPhoneNumbers(Map<String,Object> users) { 

    ArrayList<Long> phoneNumbers = new ArrayList<>(); 

    //iterate through each user, ignoring their UID 
    for (Map.Entry<String, Object> entry : users.entrySet()){ 

     //Get user map 
     Map singleUser = (Map) entry.getValue(); 
     //Get phone field and append to list 
     phoneNumbers.add((Long) singleUser.get("phone")); 
    } 

    System.out.println(phoneNumbers.toString()); 
} 

이 수신기는 명시 적으로 호출 할 때 datasnapshot 만 검색합니다. 사용자 노드 외에도 "allPhoneNumbers"노드 아래에 숫자 목록을 저장하는 것이 좋습니다. 이렇게하면 모든 숫자를 수집 할 때 데이터 스냅 샷을 가볍고 쉽게 처리 할 수 ​​있습니다. 수백 명의 사용자를 말하면 "사용자"데이터 스냅 샷이 너무 길어지고 "allPhoneNumbers"목록이 훨씬 효율적입니다.

위 코드는 예제 데이터베이스에서 테스트 된 코드입니다. 그러나 사용자의 전화 인스턴스 필드 유형에 따라 전화 필드를 String 또는 int로 형변환해야 할 수도 있습니다.

+0

감사합니다. allPhoneNumbers에 대한 키를 사용합니다. 정말 멋진 아이디어입니다. – mxml

+0

최고입니다. 파이어베이스가있는 개인 팁은 firebase (setValue/updateChildren)에 쓸 때 모든 일들을 처리하는 데있어 모든 일들을 처리합니다. 읽는 동안 비동기 리스너가있는 노드 아래 모든 것을 가져와야하기 때문에 통제력이 거의 없습니다. 따라서 작성 시점에서 데이터를 구성함으로써 데이터를 훨씬 쉽게 읽을 수 있습니다. –

7
 DatabaseReference ref1= FirebaseDatabase.getInstance().getReference(); 
     DatabaseReference ref2,ref3,ref4;  
     ref2 = ref1.child("User"); 


     ref2.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 

      Userlist = new ArrayList<String>();     
      // Result will be holded Here 
      for (DataSnapshot dsp : dataSnapshot.getChildren()) { 
        Userlist.add(String.valueOf(dsp.geValue())); //add result into array list 

       } 
    /* userlist will store all values of users, then point to every userlist item 
    and get mobile numbers*/ 
+0

감사합니다. – mxml

관련 문제