2017-03-26 1 views
2

을 수신해야합니다. fullName은 "Bobby"와 같습니다.Firebase DataSnapshot 값을 정확하게 파싱하는 방법

ref.orderByChild("fullName").equalTo("Bobby").addListenerForSingleValueEvent(new ValueEventListener() {...} 

내가 dataSnapshot.getValue()에서 얻을 것이 이것이다 : 그래서 나는 다음과 같은 구문을 사용하여 중포 기지 데이터베이스에서 데이터를 얻으려고

{id3={username=bob, score=150, fullName=Bobby}} 
내가 최고의이나 올바른 방법이 무엇인지 알고 싶습니다

어떤 id 숫자가 반환되었는지 모르겠 으면 username을 얻으시겠습니까?

은 현재 내가 이런 식으로 달성하고 있습니다 :

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference ref = database.getReference("Scores"); 

    ref.orderByChild("fullName").equalTo("Bobby").addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.i(TAG, "dataSnapshot value = "+dataSnapshot.getValue()); 
      if(dataSnapshot.hasChildren()){ 
       Iterator<DataSnapshot> iter = dataSnapshot.getChildren().iterator(); 
       DataSnapshot snap = iter.next(); 
       if(snap.hasChildren() && snap.getValue() instanceof HashMap) { 
        HashMap map = (HashMap) snap.getValue(); 
        if(map.containsKey("username")) { 
         Log.i(TAG, "onDataChange: username = " + map.get("username")); 
        } 
       } 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

편집 : 데이터베이스 구조는 다음과 같이보고한다 : 사전에

 { 
     "Scores" : { 
     "id1" : { 
      "fullName" : "Robert", 
      "score" : 96, 
      "username" : "rob" 
     }, 
     "id2" : { 
      "fullName" : "Michael", 
      "score" : 87, 
      "username" : "mike" 
     }, 
     "id3" : { 
      "fullName" : "Bobby", 
      "score" : 150, 
      "username" : "bob" 
     } 
     } 
    } 

감사합니다. 여러 항목이 fullName 동일한 'Bobby'에있을 때 그것은 잘 작동

FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference ref = database.getReference("Scores"); 

    ref.orderByChild("fullName").equalTo("Bobby").addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Log.i(TAG, "dataSnapshot value = "+dataSnapshot.getValue()); 
      if(dataSnapshot.hasChildren()){ 
       Iterator<DataSnapshot> iter = dataSnapshot.getChildren().iterator(); 
       while (iter.hasNext()){ 
        DataSnapshot snap = iter.next(); 
        String nodId = snap.getKey(); 
        String username = (String) snap.child("username").getValue(); 

        //received results 
        Log.i(TAG, username + " on nod " + nodId); 
       } 

      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

:

요약 : 원하는 결과를 얻기 위해 나는 다음과 같은 코드에 온 wilkas ' 대답을 사용

.

+1

전체 json 구조 게시 –

+0

JSON의 대표 스 니펫을 (스크린 샷이 아닌 텍스트로) 게시하십시오. [Firebase 데이터베이스 콘솔] (https://console.firebase.google.com/project/_/database/data/)에서 JSON 내보내기 링크를 클릭하면 쉽게 얻을 수 있습니다.JSON을 텍스트로 사용하면 검색이 가능해 지므로 실제 데이터로 테스트하고이를 사용하여 쉽게 답변 할 수 있습니다. 일반적으로 할 일은 단지 좋은 일입니다. –

답변

1

Scores에 청취자를 추가 했으므로 자녀는 id1, id2id3입니다. 검색어 .orderByChild("fullName").equalTo("Bobby")을 추가하면 하위 파일로 필터링하여 하나의 결과 인 id3을 얻을 수 있습니다. 따라서 첫 번째 datasnapshot은 하나의 자식 id3을 참조합니다 (이름이 "바비"인 경우 더 많은 자식이있을 수 있지만).

사용자 이름을 얻으려면 제대로받은대로 각받은 자식을 반복해야합니다.이 경우 하나의 자식 만 반복되고 해당 반복 자식의 자식 username이 있어야합니다.

모든 idX에는 username, score, fullName이 포함되어 있습니다.

String recordId = snap.getKey(); 

을 당신은 또한 얻을 수있는 내부 반복 내에서 다음과 같이

String username = (String) snap.child("username").getValue(); 
String fullName = (String) snap.child("fullName").getValue(); 
long score = (long) snap.child("score").getValue(); 

은 또한 당신이 너무 id를 검색 할 수 있습니다 다음과 같이 쉽게 username을 추출 할 수 있습니다 (귀하의 경우 snap 아동 id3에 대한 참조입니다) username 다음과 같이 :

String recordId = snap.getKey(); 
String username = (String) dataSnapshot.child(recordId).child("username").getValue(); 
관련 문제