Save the date - Google I/O returns May 18-20. Register to get the most out of the digital experience: Build your schedule, reserve space, participate in Q&As, earn Google Developer profile badges, and more. Register now

Abrufen von Daten mit der Firebase-Echtzeitdatenbank für C ++

Dieses Dokument behandelt die Grundlagen des Abrufs von Daten sowie das Bestellen 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 .

Daten abrufen

Firebase-Daten werden entweder durch einen einmaligen Aufruf von GetValue() oder durch Anhängen an einen ValueListener in einer FirebaseDatabase Referenz abgerufen. Der Wertelistener wird einmal für den Anfangszustand der Daten aufgerufen und immer wieder, wenn sich die Daten ändern.

Holen Sie sich eine DatabaseReference

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

Mit der GetValue() -Methode können Sie einmal einen statischen Snapshot des Inhalts an einem bestimmten Pfad lesen. Das Aufgabenergebnis enthält einen Snapshot, der alle Daten an diesem Speicherort enthält, 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();

Zu dem Zeitpunkt, 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 rückrufgesteuert sind als andere Anwendungen, werden Sie normalerweise nach dem Abschluss fragen.

  // 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 finden Sie einige grundlegende Fehlerprüfungen. Weitere Informationen zur Fehlerprüfung und Möglichkeiten, um festzustellen, wann das Ergebnis fertig ist, finden Sie in der Referenz zu firebase :: Future .

Hören Sie auf Ereignisse

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

ValueListener Basisklasse

Zurückrufen Typische Verwendung
OnValueChanged Lesen und warten Sie auf Änderungen am gesamten Inhalt eines Pfads.

OnChildListener Basisklasse

OnChildAdded Rufen Sie Listen mit Elementen ab oder warten Sie auf Ergänzungen zu einer Liste mit Elementen. OnChildChanged Verwendung mit OnChildChanged und OnChildRemoved , um Änderungen an Listen zu überwachen.
OnChildChanged Achten Sie auf Änderungen an den Elementen in einer Liste. Verwenden OnChildAdded OnChildRemoved mit OnChildAdded und OnChildRemoved , um Änderungen an Listen zu überwachen.
OnChildRemoved Achten Sie auf Elemente, die aus einer Liste entfernt werden. Verwenden OnChildAdded OnChildChanged mit OnChildAdded und OnChildChanged , um Änderungen an Listen zu überwachen.
OnChildMoved Achten Sie auf Änderungen in der Reihenfolge der Artikel in einer geordneten Liste. OnChildMoved Rückrufe folgen immer den OnChildChanged Rückrufen, da sich die Reihenfolge des Artikels ändert (basierend auf Ihrer aktuellen Bestellmethode).

ValueListener-Klasse

Mit den OnValueChanged Rückrufen können Sie Änderungen am Inhalt eines bestimmten Pfads abonnieren. Dieser Rückruf wird einmal ausgelöst, wenn der Listener angehängt ist, und jedes Mal, wenn sich die Daten, einschließlich untergeordneter Daten, ändern. Dem Rückruf wird ein Snapshot übergeben, der alle Daten an diesem Speicherort enthält, einschließlich untergeordneter Daten. Wenn keine Daten vorhanden sind, ist der zurückgegebene Snapshot null .

Das folgende Beispiel zeigt ein Spiel, bei dem die Ergebnisse einer Rangliste aus der Datenbank abgerufen werden:

  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&ltDataSnaphot&gt Ergebnis enthält die Daten am angegebenen Ort in der Datenbank zum Zeitpunkt des Ereignisses. Wenn Sie value() für einen Snapshot aufrufen, wird eine Variant die die Daten darstellt.

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

ChildListener-Klasse

Kinderveranstaltungen werden in Reaktion auf bestimmte Vorgänge ausgelöst, die von einer Operation an die Kinder eines Knotens geschehen wie ein neues Kind durch den zusätzlichen PushChild() Methode oder ein Kind durch das aktualisiert wird UpdateChildren() Methode. Jedes dieser Elemente zusammen kann 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 zum Abrufen einer Liste von Elementen in einer Firebase-Datenbank verwendet. Der OnChildAdded Rückruf wird einmal für jedes vorhandene OnChildAdded und dann jedes Mal erneut aufgerufen, wenn dem angegebenen Pfad ein neues OnChildAdded hinzugefügt wird. Dem Listener wird ein Schnappschuss mit den Daten des neuen Kindes übergeben.

Der OnChildChanged Rückruf wird jedes Mal aufgerufen, wenn ein OnChildChanged Knoten geändert wird. Dies schließt alle Änderungen an Nachkommen des untergeordneten Knotens ein. Es wird normalerweise in Verbindung mit den 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 untergeordnete Element.

Der OnChildRemoved Rückruf wird ausgelöst, wenn ein unmittelbares OnChildRemoved entfernt wird. Es wird normalerweise in Verbindung mit den OnChildAdded und OnChildChanged . Der an den Rückruf ü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 ein Update ausgelöst wird, das eine Neuordnung des OnChildChanged bewirkt. Es wird mit Daten verwendet, die mit OrderByChild oder OrderByValue .

Daten sortieren und filtern

Mit der Realtime Database Query Klasse können Sie Daten abrufen, die nach Schlüssel, Wert oder Wert eines untergeordneten Query 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() Ordnen Sie die Ergebnisse nach dem Wert eines angegebenen untergeordneten Schlüssels.
OrderByKey() Bestellen Sie die Ergebnisse nach untergeordneten Schlüsseln.
OrderByValue() Ordnen Sie die Ergebnisse nach untergeordneten Werten.

Sie können jeweils nur eine Bestellmethode 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 zur effizienten Strukturierung Ihrer Daten finden Sie unter Strukturieren Ihrer Datenbank .

Der Aufruf der OrderByChild() -Methode gibt den OrderByChild() 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 zum Bestellen anderer Datentypen finden Sie unter Bestellen von Abfragedaten .

Daten filtern

Um Daten zu filtern, können Sie beim Erstellen einer Abfrage eine der Grenzwert- oder Bereichsmethoden mit einer Sortiermethode kombinieren.

Methode Verwendung
LimitToFirst() Legt die maximale Anzahl von Elementen fest, die ab dem Anfang der geordneten Ergebnisliste zurückgegeben werden sollen.
LimitToLast() Legt die maximale Anzahl von Elementen fest, die am Ende der geordneten Ergebnisliste zurückgegeben werden sollen.
StartAt() Geben Sie Elemente zurück, die größer oder gleich dem angegebenen Schlüssel oder Wert sind, abhängig von der gewählten Bestellmethode.
EndAt() Geben Sie Artikel zurück, die kleiner oder gleich dem angegebenen Schlüssel oder Wert sind, abhängig von der gewählten Bestellmethode.
EqualTo() Geben Sie Artikel zurück, die dem angegebenen Schlüssel oder Wert entsprechen, abhängig von der gewählten Bestellmethode.

Im Gegensatz zu den Bestellmethoden können Sie mehrere Grenzwert- oder Bereichsfunktionen kombinieren. Sie können beispielsweise 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 einen einzelnen Artikel.

Begrenzen Sie die Anzahl der Ergebnisse

Mit den LimitToFirst() und LimitToLast() können Sie eine maximale Anzahl von LimitToLast() LimitToFirst() LimitToLast() , die für einen bestimmten Rückruf synchronisiert werden sollen. Wenn Sie beispielsweise mit LimitToFirst() ein Limit von 100 festlegen, erhalten Sie zunächst nur bis zu 100 OnChildAdded Rückrufe. Wenn in Ihrer Firebase-Datenbank weniger als 100 Elemente gespeichert sind, wird für jedes Element ein OnChildAdded Rückruf OnChildAdded .

Wenn sich Elemente ändern, erhalten Sie OnChildAdded Rückrufe für Elemente, die in die Abfrage OnChildRemoved werden, und OnChildRemoved Rückrufe für Elemente, die aus der Abfrage OnChildRemoved werden, sodass die Gesamtzahl bei 100 bleibt.

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

Nach Schlüssel oder Wert filtern

Mit StartAt() , EndAt() und EqualTo() Sie beliebige Start-, End- und Äquivalenzpunkte für Abfragen auswählen. Dies kann nützlich sein, um Daten zu paginieren oder Elemente mit Kindern zu finden, die einen bestimmten Wert haben.

Wie werden Abfragedaten bestellt?

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

OrderByChild

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

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

OrderByKey

Wenn OrderByKey() Ihre Daten mit OrderByKey() sortieren, werden die Daten in aufsteigender Reihenfolge nach Schlüssel zurückgegeben.

  1. Kinder mit einem Schlüssel, der als 32-Bit-Ganzzahl analysiert werden kann, stehen an erster Stelle und sind in aufsteigender Reihenfolge sortiert.
  2. Als nächstes folgen Kinder mit einem Zeichenfolgenwert als Schlüssel, die lexikografisch in aufsteigender Reihenfolge sortiert sind.

OrderByValue

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

Nächste Schritte