2016-12-09 2 views
1

Was ist der Unterschied zwischenUnterschied zwischen zwei Android Firebase verweist

FirebaseDatabase.getInstance().getReference() 
      .child("Users") 
      .child("Accounts") 
      .child("AC123"); 

und

FirebaseDatabase.getInstance().getReference() 
      .child("Users") 
      .child("Accounts") 
      .orderByKey() 
      .equalTo("AC123"); 

mit addListenerForSingleValueEvent scheint die gleiche DataSnapshot, dass die toString() Werte gleich sind und mit DataSnapshot.getValue zurückzukehren() scheint identische HashMaps zurückzugeben, aber nur die erste Referenz meldet, dass es "Kinder" hat.

Der Versuch, nach Kindern in der zweiten Referenz zu suchen, wirft nur eine NPE.

{ 
    "Users" : { 
    "Accounts" : { 
    "AC123" : { 
     "linked" : true, 
     "sort" : 0, 
     "type" : 1 
    } 
    }, 
etc 
+0

Bearbeiten Sie Ihre Frage so, dass sie den JSON (als Text, kein Screenshot) enthält, auf den Sie zugreifen. Außerdem: Wenn Sie Code haben, der eine NPE auslöst, teilen Sie den [minimalen Code, der diese Ausnahme reproduziert] (http://stackoverflow.com/help/mcve). Die obigen Snippets werden nicht. –

+0

Ich brauche keine Hilfe bei der NPE, da ich bereits weiß, dass der DataSnapshot keine Kinder hat, aber ich habe ein Json-Beispiel hinzugefügt. Dies ist eine sehr allgemeine Frage. Ich habe einfach nicht verstanden, warum die Snapshots, die von diesen Referenzen zurückgegeben werden, sich anders verhalten, wenn sie den gleichen Knoten zurückgeben und identisch zu sein scheinen. – Kuffs

Antwort

2

Die beiden Abfragen geben nicht denselben Knoten zurück.

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.

Dies bedeutet, dass die zweite Abfrage eine Teilmenge der Knoten unter /Users/Accounts zurückgibt. Um auf die einzelnen übereinstimmenden Knoten zuzugreifen, müssen Sie eine Schleife über 10 durchführen, auch wenn nur ein übereinstimmendes Kind vorhanden ist.

Die erste Abfrage gibt immer einen einzelnen Knoten zurück, den unter /Users/Accounts/AC123. So sind die Daten des Kindes sofort unter snapshot.getValue() verfügbar.

+0

Ich verstehe. für die erste Referenz, 'dataSnapshot.child (" type "). getValue()' gibt korrekt 1 zurück, aber für die zweite Referenz müsste ich die serserisieren und die hashmap überprüfen, um den Wert zu finden? Verstehe ich das richtig? – Kuffs

+0

Nein, Sie müssen die 'snapshot.getChildren()' Schleife durchlaufen. Siehe auch das Beispiel in der [Dokumentation zu Filterdaten] (https://firebase.google.com/docs/database/android/lists-of-data#filtering_data). –