Abrufen von Daten mit Firebase Realtime Database für C++

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Dieses Dokument behandelt die Grundlagen zum Abrufen von Daten und zum Sortieren und Filtern von Firebase-Daten.

Bevor Sie beginnen

Stellen Sie sicher, dass Sie Ihre App eingerichtet haben und auf die Datenbank zugreifen können, wie im Handbuch Get Started beschrieben.

Abrufen von Daten

Firebase-Daten werden entweder durch einen einmaligen Aufruf von GetValue() oder durch Anfügen an einen ValueListener auf einer FirebaseDatabase Referenz abgerufen. Der Wert-Listener wird einmal für den Anfangszustand der Daten aufgerufen und erneut, wenn sich die Daten ändern.

Holen Sie sich eine Datenbankreferenz

Um Daten in die Datenbank zu schreiben, benötigen Sie eine Instanz von DatabaseReference :

    // Get the root reference location of the database.
    firebase::database::DatabaseReference dbref = database->GetReference();

Daten einmal lesen

Sie können die GetValue() Methode verwenden, um einen statischen Snapshot des Inhalts an einem bestimmten Pfad einmal zu lesen. Das Aufgabenergebnis enthält einen Snapshot mit allen Daten an diesem Speicherort, einschließlich untergeordneter Daten. Wenn keine Daten vorhanden sind, ist der zurückgegebene Snapshot null .

  firebase::Future<firebase::database::DataSnapshot> result =
    dbRef.GetReference("Leaders").GetValue();

An dem Punkt, an dem die Anfrage gestellt wurde, müssen wir warten, bis die Zukunft abgeschlossen ist, bevor wir den Wert lesen können. Da Spiele normalerweise in einer Schleife ausgeführt werden und weniger Callback-gesteuert sind als andere Anwendungen, werden Sie normalerweise den Abschluss abfragen.

  // 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...
    }
  }

Dies zeigt einige grundlegende Fehlerprüfungen. Weitere Informationen zur Fehlerprüfung und Möglichkeiten zur Bestimmung, wann das Ergebnis bereit ist, finden Sie in der Referenz zu firebase::Future .

Hören Sie auf Ereignisse

Sie können Listener hinzufügen, um Datenänderungen zu abonnieren:

ValueListener Basisklasse

Ruf zurück Typische Verwendung
OnValueChanged Lesen und hören Sie auf Änderungen am gesamten Inhalt eines Pfads.

OnChildListener Basisklasse

OnChildAdded Rufen Sie Listen von Elementen ab oder hören Sie auf Ergänzungen zu einer Liste von Elementen. Empfohlene Verwendung mit OnChildChanged und OnChildRemoved , um Änderungen an Listen zu überwachen.
OnChildChanged Überwachen Sie Änderungen an den Elementen in einer Liste. Wird mit OnChildAdded und OnChildRemoved verwendet, um Änderungen an Listen zu überwachen.
OnChildRemoved Listen Sie auf Elemente, die aus einer Liste entfernt werden. Mit OnChildAdded und OnChildChanged verwenden, um Änderungen an Listen zu überwachen.
OnChildMoved Überwachen Sie Änderungen an der Reihenfolge der Elemente in einer geordneten Liste. OnChildMoved Callbacks folgen immer den OnChildChanged Callbacks, da sich die Reihenfolge des Elements ändert (basierend auf Ihrer aktuellen Sortiermethode).

ValueListener-Klasse

Sie können die OnValueChanged Callbacks verwenden, um Änderungen an den Inhalten an einem bestimmten Pfad zu abonnieren. Dieser Rückruf wird einmal ausgelöst, wenn der Listener angeschlossen wird, und erneut jedes Mal, wenn sich die Daten, einschließlich der untergeordneten Elemente, ändern. Dem Rückruf wird ein Snapshot übergeben, der alle Daten an diesem Ort enthält, einschließlich untergeordneter Daten. Wenn keine Daten vorhanden sind, ist der zurückgegebene Snapshot null .

Das folgende Beispiel zeigt ein Spiel, das die Punktzahlen einer Rangliste aus der Datenbank abruft:

  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 Ergebnis Future&ltDataSnaphot&gt enthält die Daten an der angegebenen Position in der Datenbank zum Zeitpunkt des Ereignisses. Der Aufruf von value() für einen Snapshot gibt eine Variant zurück, die die Daten darstellt.

In diesem Beispiel wird auch die OnCancelled Methode überschrieben, um zu sehen, ob der Lesevorgang abgebrochen wird. Beispielsweise kann ein Lesevorgang abgebrochen werden, wenn der Client keine Berechtigung zum Lesen von einem Firebase-Datenbankspeicherort hat. Der database::Error gibt an, warum der Fehler aufgetreten ist.

ChildListener-Klasse

Untergeordnete Ereignisse werden als Reaktion auf bestimmte Operationen ausgelöst, die mit den Kindern eines Knotens von einer Operation ausgeführt werden, wie z. B. ein neues Kind, das durch die PushChild() Methode hinzugefügt wird, oder ein Kind, das durch die UpdateChildren() Methode aktualisiert wird. Alle zusammen können nützlich sein, um Änderungen an einem bestimmten Knoten in einer Datenbank abzuhören. Beispielsweise kann ein Spiel diese Methoden zusammen verwenden, um die Aktivität in den Kommentaren einer Spielsitzung zu überwachen, wie unten gezeigt:

  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 Rückruf wird normalerweise verwendet, um eine Liste von Elementen in einer Firebase-Datenbank abzurufen. Der OnChildAdded Rückruf wird einmal für jedes vorhandene untergeordnete Element aufgerufen und dann jedes Mal erneut, wenn dem angegebenen Pfad ein neues untergeordnetes Element hinzugefügt wird. Dem Zuhörer wird ein Snapshot mit den Daten des neuen Kindes übergeben.

Der OnChildChanged Callback wird jedes Mal aufgerufen, wenn ein untergeordneter Knoten geändert wird. Dies schließt alle Änderungen an Nachkommen des untergeordneten Knotens ein. Es wird normalerweise in Verbindung mit den Aufrufen OnChildAdded und OnChildRemoved verwendet, um auf Änderungen an einer Liste von Elementen zu reagieren. Der an den Listener übergebene Snapshot enthält die aktualisierten Daten für das Kind.

Der OnChildRemoved Callback wird ausgelöst, wenn ein unmittelbar untergeordnetes Element entfernt wird. Es wird normalerweise in Verbindung mit den Callbacks OnChildAdded und OnChildChanged verwendet. Der an den Callback übergebene Snapshot enthält die Daten für das entfernte untergeordnete Element.

Der OnChildMoved Rückruf wird immer dann ausgelöst, wenn der OnChildChanged Aufruf durch eine Aktualisierung ausgelöst wird, die eine Neuordnung des untergeordneten Elements bewirkt. Es wird mit Daten verwendet, die mit OrderByChild oder OrderByValue bestellt werden.

Daten sortieren und filtern

Sie können die Realtime Database Query -Klasse verwenden, um Daten abzurufen, die nach Schlüssel, nach Wert oder nach Wert eines untergeordneten Elements sortiert sind. Sie können das sortierte Ergebnis auch nach einer bestimmten Anzahl von Ergebnissen oder einem Bereich von Schlüsseln oder Werten filtern.

Daten sortieren

Um sortierte Daten abzurufen, geben Sie zunächst eine der Sortiermethoden an, um zu bestimmen, wie die Ergebnisse sortiert werden:

Methode Verwendung
OrderByChild() Ergebnisse nach dem Wert eines angegebenen untergeordneten Schlüssels sortieren.
OrderByKey() Sortieren Sie die Ergebnisse nach untergeordneten Schlüsseln.
OrderByValue() Sortieren Sie die Ergebnisse nach untergeordneten Werten.

Sie können jeweils nur eine Order-by-Methode verwenden. Das mehrmalige Aufrufen einer Order-By-Methode in derselben Abfrage löst einen Fehler aus.

Das folgende Beispiel zeigt, wie Sie eine nach Punktzahl geordnete Rangliste abonnieren können.

  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 eine firebase::Query , die in Kombination mit einem ValueListener den Client mit der Bestenliste in der Datenbank synchronisiert, sortiert nach der Punktzahl jedes Eintrags. Weitere Informationen zum effizienten Strukturieren Ihrer Daten finden Sie unter Strukturieren Sie Ihre Datenbank .

Der Aufruf der OrderByChild() Methode 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 jedem Kind sortiert. Weitere Informationen zur Sortierung anderer Datentypen finden Sie unter Sortierung von Abfragedaten .

Filtern von Daten

Um Daten zu filtern, können Sie beim Erstellen einer Abfrage jede der Limit- oder Range-Methoden mit einer Order-By-Methode kombinieren.

Methode Verwendung
LimitToFirst() Legt die maximale Anzahl von Elementen fest, die vom Anfang der geordneten Ergebnisliste zurückgegeben werden.
LimitToLast() Legt die maximale Anzahl von Elementen fest, die vom Ende der geordneten Ergebnisliste zurückgegeben werden.
StartAt() Gibt je nach gewählter Sortiermethode Elemente zurück, die größer oder gleich dem angegebenen Schlüssel oder Wert sind.
EndAt() Gibt je nach gewählter Sortiermethode Elemente zurück, die kleiner oder gleich dem angegebenen Schlüssel oder Wert sind.
EqualTo() Gibt je nach gewählter Sortiermethode Elemente zurück, die dem angegebenen Schlüssel oder Wert entsprechen.

Im Gegensatz zu den Order-by-Methoden können Sie mehrere Limit- oder Bereichsfunktionen kombinieren. Beispielsweise können Sie die Methoden StartAt() und EndAt() kombinieren, um die Ergebnisse auf einen bestimmten Wertebereich zu beschränken.

Selbst wenn es nur eine einzige Übereinstimmung für die Abfrage gibt, ist der Schnappschuss immer noch eine Liste; es enthält nur ein einzelnes Element.

Begrenzen Sie die Anzahl der Ergebnisse

Sie können die Methoden LimitToFirst() und LimitToLast() verwenden, um eine maximale Anzahl untergeordneter Elemente festzulegen, die für einen bestimmten Rückruf synchronisiert werden sollen. Wenn Sie beispielsweise LimitToFirst() verwenden, um ein Limit von 100 festzulegen, erhalten Sie zunächst nur bis zu 100 OnChildAdded Callbacks. Wenn Sie weniger als 100 Elemente in Ihrer Firebase-Datenbank gespeichert haben, wird für jedes Element ein OnChildAdded Callback ausgelöst.

Wenn sich Elemente ändern, erhalten Sie OnChildAdded Callbacks für Elemente, die in die Abfrage aufgenommen werden, und OnChildRemoved Callbacks für Elemente, die daraus herausfallen, sodass die Gesamtzahl bei 100 bleibt.

Der folgende Code gibt beispielsweise die höchste Punktzahl aus einer Rangliste 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.

Filtern Sie nach Schlüssel oder Wert

Sie können StartAt() , EndAt() und EqualTo() verwenden, um beliebige Start-, End- und Äquivalenzpunkte für Abfragen auszuwählen. Dies kann nützlich sein, um Daten zu paginieren oder Elemente mit untergeordneten Elementen zu finden, die einen bestimmten Wert haben.

Wie Abfragedaten geordnet werden

In diesem Abschnitt wird erläutert, wie Daten von den einzelnen Sortiermethoden in der Query Klasse sortiert werden.

OrderByChild

Bei der Verwendung von OrderByChild() werden Daten, die den angegebenen untergeordneten Schlüssel enthalten, wie folgt geordnet:

  1. Kinder mit einem null für den angegebenen untergeordneten Schlüssel kommen zuerst.
  2. Als nächstes kommen Kinder mit dem Wert false für den angegebenen untergeordneten Schlüssel. Wenn mehrere Kinder den Wert false haben, werden sie lexikografisch nach Schlüssel sortiert.
  3. Als nächstes kommen Kinder mit dem Wert true für den angegebenen untergeordneten Schlüssel. Wenn mehrere Kinder den Wert true haben, werden sie lexikografisch nach Schlüssel sortiert.
  4. Kinder mit einem numerischen Wert kommen als nächstes, in aufsteigender Reihenfolge sortiert. Wenn mehrere untergeordnete Knoten denselben numerischen Wert für den angegebenen untergeordneten Knoten haben, werden sie nach Schlüssel sortiert.
  5. Zeichenfolgen kommen nach Zahlen und werden lexikographisch in aufsteigender Reihenfolge sortiert. Wenn mehrere untergeordnete Knoten denselben Wert für den angegebenen untergeordneten Knoten haben, werden sie lexikografisch nach Schlüssel geordnet.
  6. Die Objekte kommen zuletzt und werden lexikografisch nach Schlüsseln in aufsteigender Reihenfolge sortiert.

OrderByKey

Wenn Sie OrderByKey() zum Sortieren Ihrer Daten verwenden, werden die Daten in aufsteigender Reihenfolge nach Schlüssel zurückgegeben.

  1. Kinder mit einem Schlüssel, der als 32-Bit-Ganzzahl geparst werden kann, kommen zuerst, sortiert in aufsteigender Reihenfolge.
  2. Kinder mit einem Zeichenfolgenwert als Schlüssel kommen als nächstes, lexikografisch in aufsteigender Reihenfolge sortiert.

OrderByValue

Bei der Verwendung von OrderByValue() werden Kinder nach ihrem Wert geordnet. Die Sortierkriterien sind dieselben wie in OrderByChild() , außer dass der Wert des Knotens anstelle des Werts eines angegebenen untergeordneten Schlüssels verwendet wird.

Nächste Schritte

,

Dieses Dokument behandelt die Grundlagen zum Abrufen von Daten und zum Sortieren und Filtern von Firebase-Daten.

Bevor Sie beginnen

Stellen Sie sicher, dass Sie Ihre App eingerichtet haben und auf die Datenbank zugreifen können, wie im Handbuch Get Started beschrieben.

Abrufen von Daten

Firebase-Daten werden entweder durch einen einmaligen Aufruf von GetValue() oder durch Anfügen an einen ValueListener auf einer FirebaseDatabase Referenz abgerufen. Der Wert-Listener wird einmal für den Anfangszustand der Daten aufgerufen und erneut, wenn sich die Daten ändern.

Holen Sie sich eine Datenbankreferenz

Um Daten in die Datenbank zu schreiben, benötigen Sie eine Instanz von DatabaseReference :

    // Get the root reference location of the database.
    firebase::database::DatabaseReference dbref = database->GetReference();

Daten einmal lesen

Sie können die GetValue() Methode verwenden, um einen statischen Snapshot des Inhalts an einem bestimmten Pfad einmal zu lesen. Das Aufgabenergebnis enthält einen Snapshot mit allen Daten an diesem Speicherort, einschließlich untergeordneter Daten. Wenn keine Daten vorhanden sind, ist der zurückgegebene Snapshot null .

  firebase::Future<firebase::database::DataSnapshot> result =
    dbRef.GetReference("Leaders").GetValue();

An dem Punkt, an dem die Anfrage gestellt wurde, müssen wir warten, bis die Zukunft abgeschlossen ist, bevor wir den Wert lesen können. Da Spiele normalerweise in einer Schleife ausgeführt werden und weniger Callback-gesteuert sind als andere Anwendungen, werden Sie normalerweise den Abschluss abfragen.

  // 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...
    }
  }

Dies zeigt einige grundlegende Fehlerprüfungen. Weitere Informationen zur Fehlerprüfung und Möglichkeiten zur Bestimmung, wann das Ergebnis bereit ist, finden Sie in der Referenz zu firebase::Future .

Hören Sie auf Ereignisse

Sie können Listener hinzufügen, um Datenänderungen zu abonnieren:

ValueListener Basisklasse

Ruf zurück Typische Verwendung
OnValueChanged Lesen und hören Sie auf Änderungen am gesamten Inhalt eines Pfads.

OnChildListener Basisklasse

OnChildAdded Rufen Sie Listen von Elementen ab oder hören Sie auf Ergänzungen zu einer Liste von Elementen. Empfohlene Verwendung mit OnChildChanged und OnChildRemoved , um Änderungen an Listen zu überwachen.
OnChildChanged Überwachen Sie Änderungen an den Elementen in einer Liste. Wird mit OnChildAdded und OnChildRemoved verwendet, um Änderungen an Listen zu überwachen.
OnChildRemoved Listen Sie auf Elemente, die aus einer Liste entfernt werden. Mit OnChildAdded und OnChildChanged verwenden, um Änderungen an Listen zu überwachen.
OnChildMoved Überwachen Sie Änderungen an der Reihenfolge der Elemente in einer geordneten Liste. OnChildMoved Callbacks folgen immer den OnChildChanged Callbacks, da sich die Reihenfolge des Elements ändert (basierend auf Ihrer aktuellen Sortiermethode).

ValueListener-Klasse

Sie können die OnValueChanged Callbacks verwenden, um Änderungen an den Inhalten an einem bestimmten Pfad zu abonnieren. Dieser Rückruf wird einmal ausgelöst, wenn der Listener angeschlossen wird, und erneut jedes Mal, wenn sich die Daten, einschließlich der untergeordneten Elemente, ändern. Dem Rückruf wird ein Snapshot übergeben, der alle Daten an diesem Ort enthält, einschließlich untergeordneter Daten. Wenn keine Daten vorhanden sind, ist der zurückgegebene Snapshot null .

Das folgende Beispiel zeigt ein Spiel, das die Punktzahlen einer Rangliste aus der Datenbank abruft:

  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 Ergebnis Future&ltDataSnaphot&gt enthält die Daten an der angegebenen Position in der Datenbank zum Zeitpunkt des Ereignisses. Der Aufruf von value() für einen Snapshot gibt eine Variant zurück, die die Daten darstellt.

In diesem Beispiel wird auch die OnCancelled Methode überschrieben, um zu sehen, ob der Lesevorgang abgebrochen wird. Beispielsweise kann ein Lesevorgang abgebrochen werden, wenn der Client keine Berechtigung zum Lesen von einem Firebase-Datenbankspeicherort hat. Der database::Error gibt an, warum der Fehler aufgetreten ist.

ChildListener-Klasse

Untergeordnete Ereignisse werden als Reaktion auf bestimmte Operationen ausgelöst, die mit den Kindern eines Knotens von einer Operation ausgeführt werden, wie z. B. ein neues Kind, das durch die PushChild() Methode hinzugefügt wird, oder ein Kind, das durch die UpdateChildren() Methode aktualisiert wird. Alle zusammen können nützlich sein, um Änderungen an einem bestimmten Knoten in einer Datenbank abzuhören. Beispielsweise kann ein Spiel diese Methoden zusammen verwenden, um die Aktivität in den Kommentaren einer Spielsitzung zu überwachen, wie unten gezeigt:

  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 Rückruf wird normalerweise verwendet, um eine Liste von Elementen in einer Firebase-Datenbank abzurufen. Der OnChildAdded Rückruf wird einmal für jedes vorhandene untergeordnete Element aufgerufen und dann jedes Mal erneut, wenn dem angegebenen Pfad ein neues untergeordnetes Element hinzugefügt wird. Dem Zuhörer wird ein Snapshot mit den Daten des neuen Kindes übergeben.

Der OnChildChanged Callback wird jedes Mal aufgerufen, wenn ein untergeordneter Knoten geändert wird. Dies schließt alle Änderungen an Nachkommen des untergeordneten Knotens ein. Es wird normalerweise in Verbindung mit den Aufrufen OnChildAdded und OnChildRemoved verwendet, um auf Änderungen an einer Liste von Elementen zu reagieren. Der an den Listener übergebene Snapshot enthält die aktualisierten Daten für das Kind.

Der OnChildRemoved Callback wird ausgelöst, wenn ein unmittelbar untergeordnetes Element entfernt wird. Es wird normalerweise in Verbindung mit den Callbacks OnChildAdded und OnChildChanged verwendet. Der an den Callback übergebene Snapshot enthält die Daten für das entfernte untergeordnete Element.

Der OnChildMoved Rückruf wird immer dann ausgelöst, wenn der OnChildChanged Aufruf durch eine Aktualisierung ausgelöst wird, die eine Neuordnung des untergeordneten Elements verursacht. Es wird mit Daten verwendet, die mit OrderByChild oder OrderByValue bestellt werden.

Daten sortieren und filtern

Sie können die Realtime Database Query -Klasse verwenden, um Daten abzurufen, die nach Schlüssel, nach Wert oder nach Wert eines untergeordneten Elements sortiert sind. Sie können das sortierte Ergebnis auch nach einer bestimmten Anzahl von Ergebnissen oder einem Bereich von Schlüsseln oder Werten filtern.

Daten sortieren

Um sortierte Daten abzurufen, geben Sie zunächst eine der Sortiermethoden an, um zu bestimmen, wie die Ergebnisse sortiert werden:

Methode Verwendung
OrderByChild() Ergebnisse nach dem Wert eines angegebenen untergeordneten Schlüssels sortieren.
OrderByKey() Sortieren Sie die Ergebnisse nach untergeordneten Schlüsseln.
OrderByValue() Sortieren Sie die Ergebnisse nach untergeordneten Werten.

Sie können jeweils nur eine Order-by-Methode verwenden. Das mehrmalige Aufrufen einer Order-By-Methode in derselben Abfrage löst einen Fehler aus.

Das folgende Beispiel zeigt, wie Sie eine nach Punktzahl geordnete Rangliste abonnieren können.

  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 eine firebase::Query , die in Kombination mit einem ValueListener den Client mit der Bestenliste in der Datenbank synchronisiert, sortiert nach der Punktzahl jedes Eintrags. Weitere Informationen zum effizienten Strukturieren Ihrer Daten finden Sie unter Strukturieren Sie Ihre Datenbank .

Der Aufruf der OrderByChild() Methode 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 jedem Kind sortiert. Weitere Informationen zur Sortierung anderer Datentypen finden Sie unter Sortierung von Abfragedaten .

Filtern von Daten

Um Daten zu filtern, können Sie beim Erstellen einer Abfrage jede der Limit- oder Range-Methoden mit einer Order-By-Methode kombinieren.

Methode Verwendung
LimitToFirst() Legt die maximale Anzahl von Elementen fest, die vom Anfang der geordneten Ergebnisliste zurückgegeben werden.
LimitToLast() Legt die maximale Anzahl von Elementen fest, die vom Ende der geordneten Ergebnisliste zurückgegeben werden.
StartAt() Gibt je nach gewählter Sortiermethode Elemente zurück, die größer oder gleich dem angegebenen Schlüssel oder Wert sind.
EndAt() Gibt je nach gewählter Sortiermethode Elemente zurück, die kleiner oder gleich dem angegebenen Schlüssel oder Wert sind.
EqualTo() Gibt je nach gewählter Sortiermethode Elemente zurück, die dem angegebenen Schlüssel oder Wert entsprechen.

Im Gegensatz zu den Order-by-Methoden können Sie mehrere Limit- oder Bereichsfunktionen kombinieren. Beispielsweise können Sie die Methoden StartAt() und EndAt() kombinieren, um die Ergebnisse auf einen bestimmten Wertebereich zu beschränken.

Selbst wenn es nur eine einzige Übereinstimmung für die Abfrage gibt, ist der Schnappschuss immer noch eine Liste; es enthält nur ein einzelnes Element.

Begrenzen Sie die Anzahl der Ergebnisse

Sie können die Methoden LimitToFirst() und LimitToLast() verwenden, um eine maximale Anzahl untergeordneter Elemente festzulegen, die für einen bestimmten Rückruf synchronisiert werden sollen. Wenn Sie beispielsweise LimitToFirst() verwenden, um ein Limit von 100 festzulegen, erhalten Sie zunächst nur bis zu 100 OnChildAdded Callbacks. Wenn Sie weniger als 100 Elemente in Ihrer Firebase-Datenbank gespeichert haben, wird für jedes Element ein OnChildAdded Callback ausgelöst.

Wenn sich Elemente ändern, erhalten Sie OnChildAdded Callbacks für Elemente, die in die Abfrage aufgenommen werden, und OnChildRemoved Callbacks für Elemente, die daraus herausfallen, sodass die Gesamtzahl bei 100 bleibt.

Der folgende Code gibt beispielsweise die höchste Punktzahl aus einer Rangliste 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.

Filtern Sie nach Schlüssel oder Wert

Sie können StartAt() , EndAt() und EqualTo() verwenden, um beliebige Start-, End- und Äquivalenzpunkte für Abfragen auszuwählen. Dies kann nützlich sein, um Daten zu paginieren oder Elemente mit untergeordneten Elementen zu finden, die einen bestimmten Wert haben.

Wie Abfragedaten geordnet werden

In diesem Abschnitt wird erläutert, wie Daten von den einzelnen Sortiermethoden in der Query Klasse sortiert werden.

OrderByChild

Bei der Verwendung von OrderByChild() werden Daten, die den angegebenen untergeordneten Schlüssel enthalten, wie folgt geordnet:

  1. Kinder mit einem null für den angegebenen untergeordneten Schlüssel kommen zuerst.
  2. Als nächstes kommen Kinder mit dem Wert false für den angegebenen untergeordneten Schlüssel. Wenn mehrere Kinder den Wert false haben, werden sie lexikografisch nach Schlüssel sortiert.
  3. Als nächstes kommen Kinder mit dem Wert true für den angegebenen untergeordneten Schlüssel. Wenn mehrere Kinder den Wert true haben, werden sie lexikografisch nach Schlüssel sortiert.
  4. Kinder mit einem numerischen Wert kommen als nächstes, in aufsteigender Reihenfolge sortiert. Wenn mehrere untergeordnete Knoten denselben numerischen Wert für den angegebenen untergeordneten Knoten haben, werden sie nach Schlüssel sortiert.
  5. Zeichenfolgen kommen nach Zahlen und werden lexikographisch in aufsteigender Reihenfolge sortiert. Wenn mehrere untergeordnete Knoten denselben Wert für den angegebenen untergeordneten Knoten haben, werden sie lexikografisch nach Schlüssel geordnet.
  6. Die Objekte kommen zuletzt und werden lexikografisch nach Schlüsseln in aufsteigender Reihenfolge sortiert.

OrderByKey

Wenn Sie OrderByKey() zum Sortieren Ihrer Daten verwenden, werden die Daten in aufsteigender Reihenfolge nach Schlüssel zurückgegeben.

  1. Kinder mit einem Schlüssel, der als 32-Bit-Ganzzahl geparst werden kann, kommen zuerst, sortiert in aufsteigender Reihenfolge.
  2. Kinder mit einem Zeichenfolgenwert als Schlüssel kommen als nächstes, lexikografisch in aufsteigender Reihenfolge sortiert.

OrderByValue

Bei der Verwendung von OrderByValue() werden Kinder nach ihrem Wert geordnet. Die Sortierkriterien sind dieselben wie in OrderByChild() , außer dass der Wert des Knotens anstelle des Werts eines angegebenen untergeordneten Schlüssels verwendet wird.

Nächste Schritte