2017-01-31 6 views
0

Ich benutze Firebase für Android und konfrontiert mit etwas Fehlverhalten von limitToLast() Abfrage. Was ich zu tun bin versucht, ist das letzte Kind der Liste zu bekommen, und durch andere Kinder dieses Knotens iterieren:Android Firebase seltsam limitToLast (1) Verhalten

database.getReference().child("draws").limitToLast(1).addValueEventListener(new ValueEventListener() { 
@Override                          
public void onDataChange(DataSnapshot dataSnapshot) {               
    for(DataSnapshot snap: dataSnapshot.getChildren()){ 
     //Some work                        
     snap.getValue()             
    }                           
}                            

@Override                          
public void onCancelled(DatabaseError databaseError) { 
     //Some error handling                                      
}                            
});                             

Nehmen wir an, ich bin mit limitToLast (1), um das Kind zu bekommen draws/2 (siehe den Datenbank-Snap unten), der der letzte in einer Draw-Liste ist. Und danach verwende ich dataSnapshot.getChildren(), um die Liste der untergeordneten Elemente draws/2 zu erhalten. Was ich nach dem Durchlaufen der dataSnapshot.getChildren() Liste erhalten sollte: "85", "86", "60", "7" als separate Werte mit snap.getValue(). ToString() in der Schleife.

enter image description here

Was ich tatsächlich bekommen, ist der Wert des letzten Kindes ohne seine Kinder erreichbar. Ergebnis: "[85, 86, 60, 7]". Es sieht so aus, als ob dataSnapshot.getChildren() keine untergeordneten Elemente des Knotens draws/2 erhält, sondern nur einen ganzen Wert des Knotens erhält.

Als Test habe ich versucht, limitToLast (1) Abfrage loszuwerden und mit Kind ("2") ersetzen und alles hat gut funktioniert.

Es ist möglich, dass ich die Funktionalität von limitToLast() missverstanden habe, aber wenn es wahr ist, wie kann ich auf Kinder des letzten Knotens zugreifen?

Antwort

1

Wenn Sie eine Abfrage für die Firebase-Datenbank ausführen, werden möglicherweise mehrere Ergebnisse angezeigt. Der Snapshot enthält also eine Liste dieser Ergebnisse. Selbst wenn nur ein Ergebnis vorhanden ist, enthält der Snapshot eine Liste mit einem Ergebnis.

So wird Ihr Code zu ersten müssen das draws/2 Kind finden (durch Looping) und dann Schleife über die Kinder:

public void onDataChange(DataSnapshot dataSnapshot) {               
    for(DataSnapshot snap: dataSnapshot.getChildren()){ 
     System.out.println(snap.getKey()); // prints 2 
     for (DataSnapshot snap2: snap.getChildren()){ 
      //Some work                        
      snap.getValue()             
     } 
    }                           
} 

Es ist in der Regel einfacher Abfrageergebnisse zu handhaben durch addChildEventListener verwenden, weil dann Sie erhalten für jedes Kind einen separaten Anruf an onChildAdded (und können so die zusätzliche Schleife überspringen).

Btw: es gibt viele Gründe, warum die documentation for the Firebase Database doesn't use arrays und sogar recommends against using arrays. Ignoriere sie auf eigene Gefahr.

+0

Danke, Frank! Genau das habe ich gesucht. Ich bin sehr froh, dass Sie das Firebase-Thema auf StackOverflow aktiv moderieren. Ihre Antworten sind sehr hilfreich – NickitaX

+0

Gern geschehen. Mach weiter Hacking! –