In diesem Dokument werden die Grundlagen des Abrufens von Daten und die Sortierung und Filterung von Firebase-Daten erläutert.
Hinweis
Prüfen Sie, ob Sie Ihre App eingerichtet haben und wie in den Anleitungen beschrieben auf die Datenbank zugreifen können.
im Get Started
-Leitfaden.
Daten werden abgerufen
Firebase-Daten werden entweder durch einen einmaligen Aufruf von GetValue()
oder durch Anhängen an eine ValueListener
an einer FirebaseDatabase
-Referenz abgerufen. Der Wert
Listener wird einmal für den Anfangszustand der Daten und immer dann aufgerufen, wenn der
Änderungen von Daten.
Datenbankreferenz abrufen
Zum Schreiben von Daten in die Datenbank benötigen Sie eine Instanz von DatabaseReference
:
// Get the root reference location of the database. firebase::database::DatabaseReference dbref = database->GetReference();
Daten einmal lesen
Mit der GetValue()
-Methode können Sie einmal einen statischen Snapshot des Inhalts an einem bestimmten Pfad lesen. Das Ergebnis der Aufgabe enthält einen Snapshot.
die alle Daten an diesem Speicherort enthalten, einschließlich untergeordneter Daten. Wenn keine Daten vorhanden sind, wird null
zurückgegeben.
firebase::Future<firebase::database::DataSnapshot> result = dbRef.GetReference("Leaders").GetValue();
Zu diesem Zeitpunkt wurde die Anfrage gestellt, aber wir müssen warten, bis das Future bevor wir den Wert lesen können. Da Spiele meist in einer Schleife laufen, weniger Callback-gesteuert sind als andere Anwendungen, fragen Sie in der Regel nach Fertigstellung.
// In the game loop that polls for the result... if (result.status() != firebase::kFutureStatusPending) { if (result.status() != firebase::kFutureStatusComplete) { LogMessage("ERROR: GetValue() returned an invalid result."); // Handle the error... } else if (result.error() != firebase::database::kErrorNone) { LogMessage("ERROR: GetValue() returned error %d: %s", result.error(), result.error_message()); // Handle the error... } else { firebase::database::DataSnapshot snapshot = result.result(); // Do something with the snapshot... } }
Hier sehen Sie einige grundlegende Fehlerprüfungen, firebase::Future-Referenz für weitere Informationen Informationen zur Fehlerprüfung und Möglichkeiten, um festzustellen, wann das Ergebnis verfügbar ist.
Auf Ereignisse warten
Sie können Listener hinzufügen, um über Änderungen an Daten informiert zu werden:
ValueListener
-Basisklasse
Rückruf | Typische Verwendung |
---|---|
OnValueChanged |
Änderungen am gesamten Inhalt eines Pfads lesen und beobachten. |
OnChildListener
Basisklasse
OnChildAdded
| Rufen Sie Listen von Elementen ab oder achten Sie auf Ergänzungen zu einer Liste von Elementen.
Empfohlene Verwendung mit OnChildChanged und
OnChildRemoved zum Überwachen von Änderungen an Listen. |
OnChildChanged |
Auf Änderungen an den Elementen in einer Liste achten Verwenden mit
OnChildAdded und OnChildRemoved zum Überwachen
Änderungen an Listen. |
OnChildRemoved |
Beobachten Sie, ob Elemente aus einer Liste entfernt werden. Verwende OnChildAdded und OnChildChanged , um Änderungen an Listen zu beobachten. |
OnChildMoved |
Beobachten von Änderungen an der Reihenfolge der Elemente in einer sortierten Liste
OnChildMoved -Callbacks folgen immer dem
OnChildChanged Rückruf aufgrund der Bestellung des Artikels
ändern (basierend auf Ihrer aktuellen Bestellmethode). |
ValueListener-Klasse
Mit den OnValueChanged
-Callbacks können Sie Änderungen der
Pfads enthalten. Dieser Callback wird einmal ausgelöst, wenn der Listener angehängt wird, und dann jedes Mal, wenn sich die Daten, einschließlich der untergeordneten Elemente, ändern. Dem Rückruf wird ein Snapshot mit allen Daten an diesem Speicherort übergeben, einschließlich untergeordneter Daten. Wenn keine Daten vorhanden sind, wird null
zurückgegeben.
Das folgende Beispiel zeigt ein Spiel, in dem die Punktzahlen einer Bestenliste abgerufen werden. aus der Datenbank:
class LeadersValueListener : public firebase::database::ValueListener { public: void OnValueChanged( const firebase::database::DataSnapshot& snapshot) override { // Do something with the data in snapshot... } void OnCancelled(const firebase::database::Error& error_code, const char* error_message) override { LogMessage("ERROR: LeadersValueListener canceled: %d: %s", error_code, error_message); } }; // Elsewhere in the code... LeadersValueListener* listener = new LeadersValueListener(); firebase::Future<firebase::database::DataSnapshot> result = dbRef.GetReference("Leaders").AddValueListener(listener);
Das Future<DataSnapshot>
-Ergebnis enthält die Daten am angegebenen Speicherort in der Datenbank zum Zeitpunkt des Ereignisses. Wenn Sie value()
für einen Snapshot aufrufen, wird eine Variant
zurückgegeben, die die Daten darstellt.
In diesem Beispiel wird auch die OnCancelled
-Methode überschrieben, um zu prüfen, ob die Lesevorgänge abgebrochen werden. Beispielsweise kann ein Lesevorgang abgebrochen werden, wenn der Client keine
Berechtigung zum Lesen aus einem Firebase-Datenbankspeicherort. Das database::Error
wird
um anzugeben, warum der Fehler aufgetreten ist.
Klasse „ChildListener“
Untergeordnete Ereignisse werden als Reaktion auf bestimmte Vorgänge ausgelöst, die
Untergeordnete Elemente eines Knotens aus einem Vorgang wie einem neuen untergeordneten Element, das über die
PushChild()
-Methode oder ein untergeordnetes Element, das über die UpdateChildren()
aktualisiert wird
. Zusammen können sie nützlich sein, um Änderungen an einem bestimmten Knoten in einer Datenbank zu beobachten. In einem Spiel können diese Methoden beispielsweise kombiniert werden, um die Aktivität in den Kommentaren einer Spielsitzung zu überwachen, wie unten dargestellt:
class SessionCommentsChildListener : public firebase::database::ChildListener { public: void OnChildAdded(const firebase::database::DataSnapshot& snapshot, const char* previous_sibling) override { // Do something with the data in snapshot ... } void OnChildChanged(const firebase::database::DataSnapshot& snapshot, const char* previous_sibling) override { // Do something with the data in snapshot ... } void OnChildRemoved( const firebase::database::DataSnapshot& snapshot) override { // Do something with the data in snapshot ... } void OnChildMoved(const firebase::database::DataSnapshot& snapshot, const char* previous_sibling) override { // Do something with the data in snapshot ... } void OnCancelled(const firebase::database::Error& error_code, const char* error_message) override { LogMessage("ERROR: SessionCommentsChildListener canceled: %d: %s", error_code, error_message); } }; // elsewhere .... SessionCommentsChildListener* listener = new SessionCommentsChildListener(); firebase::Future<firebase::database::DataSnapshot> result = dbRef.GetReference("GameSessionComments").AddChildListener(listener);
Der OnChildAdded
-Callback wird in der Regel verwendet, um eine Liste von
Elemente in einer Firebase-Datenbank. Der OnChildAdded
-Callback wird einmal für jedes vorhandene untergeordnete Element und dann jedes Mal wieder aufgerufen, wenn dem angegebenen Pfad ein neues untergeordnetes Element hinzugefügt wird. Dem Listener wird ein Snapshot übergeben, der das neue
Daten.
Der OnChildChanged
-Callback wird bei jeder Änderung eines untergeordneten Knotens aufgerufen.
Dies schließt alle Änderungen an Nachfolgerelemente des untergeordneten Knotens ein. Sie wird in der Regel in Verbindung mit den Aufrufen OnChildAdded
und OnChildRemoved
verwendet, um auf Änderungen an einer Liste von Elementen zu reagieren. Der an den
Listener enthält die aktualisierten Daten für das untergeordnete Element.
Der OnChildRemoved
-Callback wird ausgelöst, wenn ein sofortiges untergeordnetes Element entfernt wird.
Sie wird normalerweise in Verbindung mit den OnChildAdded
und
OnChildChanged
-Rückrufe. Der an den Callback übergebene Snapshot enthält
die Daten für das entfernte untergeordnete Element.
Der OnChildMoved
-Callback wird ausgelöst, wenn der OnChildChanged
-Aufruf durch eine Aktualisierung ausgelöst wird, die eine Neusortierung des untergeordneten Elements zur Folge hat. Es ist
wird für Daten verwendet, die mit OrderByChild
oder OrderByValue
sortiert sind.
Daten sortieren und filtern
Mit der Klasse Realtime Database Query
können Sie Daten nach Schlüssel, Wert oder Wert eines untergeordneten Elements abrufen. Sie können die sortierten Ergebnisse auch auf eine bestimmte Anzahl von Ergebnissen oder einen Bereich von Schlüsseln oder Werten begrenzen.
Daten sortieren
Wenn Sie sortierte Daten abrufen möchten, müssen Sie zuerst eine der Sortierungsmethoden angeben, um zu bestimmen, wie die Ergebnisse sortiert werden:
Methode | Nutzung |
---|---|
OrderByChild() |
Sortiert die Ergebnisse nach dem Wert eines bestimmten untergeordneten Schlüssels. |
OrderByKey()
| Sortieren Sie die Ergebnisse nach untergeordneten Schlüsseln. |
OrderByValue() |
Ergebnisse nach untergeordneten Werten sortieren |
Sie können jeweils nur eine Sortiermethode verwenden. Eine Order-by-Methode aufrufen mehrfach in derselben Abfrage führt zu einem Fehler.
Im folgenden Beispiel wird gezeigt, wie Sie eine Bestenliste abonnieren können, die nach Punktzahl sortiert ist.
firebase::database::Query query = dbRef.GetReference("Leaders").OrderByChild("score"); // To get the resulting DataSnapshot either use query.GetValue() and poll the // future, or use query.AddValueListener() and register to handle the // OnValueChanged callback.
Dies definiert einen firebase::Query
, der in Kombination mit einem
ValueListener synchronisiert den Client mit der Bestenliste.
in der Datenbank sortiert nach der Punktzahl jedes Eintrags.
Weitere Informationen zur effizienten Strukturierung Ihrer Daten finden Sie unter
Datenbank strukturieren
Der Aufruf der Methode OrderByChild()
gibt den untergeordneten Schlüssel an, nach dem die Ergebnisse sortiert werden sollen. In diesem Fall werden die Ergebnisse nach dem Wert des "score"
-Werts in den einzelnen untergeordneten Elementen sortiert. Weitere Informationen zur
Reihenfolge anderer Datentypen
Siehe Reihenfolge der Abfragedaten.
Daten filtern
Zum Filtern von Daten können Sie beliebige Grenzwert- oder Bereichsmethoden mit einem -Methode beim Erstellen einer Abfrage.
Methode | Nutzung |
---|---|
LimitToFirst() |
Legt die maximale Anzahl von Elementen fest, die ab Beginn des sortierte Ergebnisliste. |
LimitToLast() |
Legt die maximale Anzahl der Artikel fest, die ab dem Ende des bestellten Artikels zurückgegeben werden. Liste der Ergebnisse. |
StartAt() |
Gibt Elemente zurück, die größer oder gleich dem angegebenen Schlüssel oder Wert sind abhängig von der gewählten Order-by-Methode. |
EndAt() |
Gibt Elemente zurück, die kleiner oder gleich dem angegebenen Schlüssel oder Wert sind, je nach ausgewählter Sortiermethode. |
EqualTo() |
Je nach ausgewählter Sortiermethode werden Elemente zurückgegeben, die dem angegebenen Schlüssel oder Wert entsprechen. |
Im Gegensatz zu den Sortiermethoden können Sie mehrere Limit- oder Bereichsfunktionen kombinieren.
Sie können beispielsweise die Methoden StartAt()
und EndAt()
kombinieren, um die Ergebnisse auf einen bestimmten Wertebereich zu beschränken.
Auch wenn es nur eine einzige Übereinstimmung für die Abfrage gibt, bleibt der Snapshot unverändert. eine Liste enthält sie nur ein einzelnes Element.
Anzahl der Ergebnisse begrenzen
Mit den Methoden LimitToFirst()
und LimitToLast()
können Sie eine maximale Anzahl von untergeordneten Elementen festlegen, die für einen bestimmten Rückruf synchronisiert werden sollen. Wenn Sie beispielsweise mit LimitToFirst()
ein Limit von 100 festlegen, erhalten Sie anfangs nur bis zu 100 OnChildAdded
-Callbacks. Wenn in deiner Firebase-Datenbank weniger als 100 Elemente gespeichert sind, wird für jedes Element ein OnChildAdded
-Callback ausgelöst.
Wenn sich Artikel ändern, erhalten Sie OnChildAdded
Callbacks für Artikel, die in die Abfrage aufgenommen werden, und OnChildRemoved
Callbacks für Artikel, die daraus entfernt werden, sodass die Gesamtzahl bei 100 bleibt.
Der folgende Code gibt beispielsweise die höchste Punktzahl einer Bestenliste zurück:
firebase::database::Query query = dbRef.GetReference("Leaders").OrderByChild("score").LimitToLast(1); // To get the resulting DataSnapshot either use query.GetValue() and poll the // future, or use query.AddValueListener() and register to handle the // OnValueChanged callback.
Nach Schlüssel oder Wert filtern
Mit StartAt()
, EndAt()
und EqualTo()
können Sie beliebige Start-, End- und Äquivalenzpunkte für Abfragen auswählen. Dies kann nützlich sein,
zum Paginieren von Daten oder zum Suchen von Elementen mit untergeordneten Elementen, die einen bestimmten Wert haben.
So werden Abfragedaten geordnet
In diesem Abschnitt wird erläutert, wie Daten mit den einzelnen Sortierungsmethoden in der Query
-Klasse sortiert werden.
OrderByChild
Bei Verwendung von OrderByChild()
werden Daten, die den angegebenen untergeordneten Schlüssel enthalten, so sortiert:
- Untergeordnete Schlüssel mit dem Wert
null
für den angegebenen untergeordneten Schlüssel werden . - Als Nächstes folgen untergeordnete Elemente mit dem Wert
false
für den angegebenen untergeordneten Schlüssel. Wenn mehrere untergeordnete Elemente den Wertfalse
haben, sind sie lexikografisch nach Schlüssel sortiert. - Als Nächstes folgen untergeordnete Elemente mit dem Wert
true
für den angegebenen untergeordneten Schlüssel. Wenn mehrere untergeordnete Elemente den Werttrue
haben, sind sie lexikografisch nach Schlüssel sortiert. - Als Nächstes folgen untergeordnete Elemente mit einem numerischen Wert, sortiert in aufsteigender Reihenfolge. Wenn Mehrere untergeordnete Elemente haben denselben numerischen Wert für das angegebene untergeordnete Element werden sie nach Schlüsseln sortiert.
- Strings folgen den Zahlen und werden alphabetisch in aufsteigender Reihenfolge sortiert. Wenn mehrere untergeordnete Elemente denselben Wert für den angegebenen untergeordneten Knoten haben, werden sie nach Schlüssel sortiert.
- Objekte kommen an letzter Stelle und werden lexikografisch nach Schlüssel in aufsteigender Reihenfolge sortiert.
OrderByKey
Wenn Sie Ihre Daten mit OrderByKey()
sortieren, werden sie in aufsteigender Reihenfolge nach Schlüssel zurückgegeben.
- Untergeordnete Elemente mit einem Schlüssel, der als 32‑Bit-Ganzzahl geparst werden kann, werden zuerst in aufsteigender Reihenfolge sortiert.
- Als Nächstes folgen untergeordnete Elemente mit einem Stringwert als Schlüssel, sortiert in aufsteigender lexikografischer Reihenfolge.
OrderByValue
Wenn Sie OrderByValue()
verwenden, werden die untergeordneten Elemente nach ihrem Wert sortiert. Die Sortierkriterien sind dieselben wie in OrderByChild()
, mit der Ausnahme, dass der Wert des Knotens anstelle des Werts eines angegebenen untergeordneten Schlüssels verwendet wird.