2017-03-26 3 views
2

Ich muss eine username erhalten, die eine fullName gleich "Bobby" hat. Also versuche ich Daten von Firebase-Datenbank zu erhalten mit der folgenden Syntax:Wie Firebase DataSnapshot Wert korrekt zu analysieren

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

Was ich von dataSnapshot.getValue() bekommen, ist dies:

{id3={username=bob, score=150, fullName=Bobby}} 

Ich mag würde wissen, was ist die beste oder richtige Weg um die username zu bekommen, wenn ich nicht weiß, welche id Nummer zurückgegeben wurde? Ich bin es auf diese Weise

Derzeit erreicht wird:

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) { 

     } 
    }); 

EDIT: Die Datenbankstruktur ist wie folgt aussehen:

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

Vielen Dank im Voraus.

ZUSAMMENFASSUNG:

Mit wilkas' Antwort, die ich auf den folgenden Code-Schnipsel kam das gewünschte Ergebnis zu erhalten:

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) { 

     } 
    }); 

Es funktioniert gut, wenn mehrere Einträge haben ein fullName gleich 'Bobby' .

+1

Veröffentlichen Sie Ihre gesamte JSON-Struktur –

+0

Bitte posten Sie ein repräsentatives Snippet Ihres JSON (als Text, nicht als Screenshot). Sie können dies leicht erreichen, indem Sie in [Firebase-Datenbankkonsole] (https://console.firebase.google.com/project/_/database/data/) auf den Link JSON exportieren klicken.Da der JSON als Text durchsuchbar ist, können wir ihn einfach verwenden, um mit Ihren tatsächlichen Daten zu testen und sie in unserer Antwort zu verwenden, und im Allgemeinen ist dies nur eine gute Sache. –

Antwort

1

Da Sie Hörer unter Scores hinzufügen, sind Ihre Kinder id1, id2 und id3. Durch das Hinzufügen der Abfrage .orderByChild("fullName").equalTo("Bobby") filtern Sie nach Subchild und erhalten ein Ergebnis id3. Also bezieht sich Ihre erste datasnapshot auf ein Kind id3 (obwohl es mehr Kinder geben könnte, wenn sie denselben Namen von "Bobby" hätten).

Um den Benutzernamen zu erhalten, müssen Sie jedes empfangene Kind (wie Sie es richtig tun) durchlaufen - in diesem Fall wird nur ein Kind iteriert - und dann Kind username dieses iterierten Kindes.

Da wissen Sie, dass jeder idX diese Kinder enthält: username, score, fullName. Sie können username leicht extrahieren wie folgt (in Ihrem Fall ist snap Bezug auf das Kind id3):

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

Darüber hinaus können Sie id auch wie folgt abrufen:

String recordId = snap.getKey(); 

Innerhalb der inneren Iteration kann man auch bekommen username wie folgt:

String recordId = snap.getKey(); 
String username = (String) dataSnapshot.child(recordId).child("username").getValue(); 
Verwandte Themen