Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

Abrufen von Daten

In diesem Dokument werden die Grundlagen des Abrufens von Daten sowie das Ordnen und Filtern von Firebase-Daten behandelt.

Bevor Sie beginnen

Bevor Sie Realtime Database verwenden können , müssen Sie:

  • Registrieren Sie Ihr Unity-Projekt und konfigurieren Sie es für die Verwendung von Firebase.

    • Wenn Ihr Unity-Projekt bereits Firebase verwendet, ist es bereits für Firebase registriert und konfiguriert.

    • Wenn Sie kein Unity-Projekt haben, können Sie eine Beispiel-App herunterladen.

  • Fügen Sie Ihrem Unity-Projekt das Firebase Unity SDK (insbesondere FirebaseDatabase.unitypackage ) hinzu.

Beachten Sie, dass das Hinzufügen von Firebase zu Ihrem Unity-Projekt Aufgaben sowohl in der Firebase-Konsole als auch in Ihrem geöffneten Unity-Projekt umfasst (beispielsweise laden Sie Firebase-Konfigurationsdateien von der Konsole herunter und verschieben sie dann in Ihr Unity-Projekt).

Abrufen von Daten

Firebase-Daten werden entweder durch einen einmaligen Aufruf von GetValueAsync() oder durch Anhängen an ein Ereignis in einer FirebaseDatabase Referenz abgerufen. Der Ereignis-Listener wird einmal für den Anfangszustand der Daten aufgerufen und jedes Mal, wenn sich die Daten ändern.

Holen Sie sich eine Datenbank-Referenz

Um Daten aus der Datenbank zu lesen, benötigen Sie eine Instanz von DatabaseReference :

using Firebase;
using Firebase.Database;

public class MyScript: MonoBehaviour {
  void Start() {
    // Get the root reference location of the database.
    DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference;
  }
}

Daten einmal lesen

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

    FirebaseDatabase.DefaultInstance
      .GetReference("Leaders")
      .GetValueAsync().ContinueWith(task => {
        if (task.IsFaulted) {
          // Handle the error...
        }
        else if (task.IsCompleted) {
          DataSnapshot snapshot = task.Result;
          // Do something with snapshot...
        }
      });

Auf Ereignisse achten

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

Veranstaltung Typische Verwendung
ValueChanged Lesen und hören Sie auf Änderungen am gesamten Inhalt eines Pfads.
ChildAdded Rufen Sie Listen von Elementen ab oder hören Sie auf Ergänzungen zu einer Liste von Elementen. ChildChanged Verwendung mit ChildChanged und ChildRemoved , um Änderungen an Listen zu überwachen.
ChildChanged Achten Sie auf Änderungen an den Elementen in einer Liste. Mit ChildAdded und ChildRemoved , um Änderungen an Listen zu überwachen.
ChildRemoved Achten Sie darauf, dass Elemente aus einer Liste entfernt werden. Mit ChildAdded und ChildChanged , um Änderungen an Listen zu überwachen.
ChildMoved Achten Sie auf Änderungen an der Reihenfolge der Elemente in einer geordneten Liste. ChildMoved Ereignisse folgen immer dem ChildChanged Ereignis, das eine Änderung der ChildChanged verursacht hat (basierend auf Ihrer aktuellen Order-by-Methode).

ValueChanged-Ereignis

Sie können das ValueChanged Ereignis verwenden, um Änderungen des Inhalts an einem bestimmten Pfad zu abonnieren. Dieses Ereignis wird einmal ausgelöst, wenn der Listener angehängt wird, und jedes Mal, wenn sich die Daten, einschließlich der untergeordneten Elemente, ändern. Dem Ereignisrückruf wird ein Snapshot übergeben, der alle Daten an diesem Speicherort enthält, einschließlich der untergeordneten Daten. Wenn keine Daten vorhanden sind, ist der zurückgegebene Snapshot null .

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

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders")
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

ValueChangedEventArgs enthält einen DataSnapshot , der die Daten zum Zeitpunkt des Ereignisses an der angegebenen Position in der Datenbank enthält. Das Aufrufen von Value für einen Snapshot gibt ein Dictionary<string, object> das die Daten darstellt. Wenn an der Position keine Daten vorhanden sind, gibt der Aufruf von Value null .

In diesem Beispiel wird auch args.DatabaseError untersucht, um args.DatabaseError , ob der args.DatabaseError abgebrochen wird. Ein Lesevorgang kann beispielsweise abgebrochen werden, wenn der Client keine Berechtigung zum Lesen von einem Firebase-Datenbankspeicherort hat. Der DatabaseError gibt an, warum der Fehler aufgetreten ist.

Sie können das Ereignis später mit einer beliebigen DatabaseReference mit demselben Pfad abbestellen. DatabaseReference Instanzen sind kurzlebig und können als Möglichkeit betrachtet werden, auf beliebige Pfade und Abfragen zuzugreifen.

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders")
        .ValueChanged -= HandleValueChanged; // unsubscribe from ValueChanged.
    }

Kinderveranstaltungen

Untergeordnete Ereignisse werden als Reaktion auf bestimmte Vorgänge ausgelöst, die den UpdateChildrenAsync() Knoten eines Knotens von einem Vorgang passieren, z. B. ein neues UpdateChildrenAsync() über die Push() Methode hinzugefügt wird oder ein UpdateChildrenAsync() über die UpdateChildrenAsync() Methode aktualisiert wird. Alle zusammen können nützlich sein, um Änderungen an einem bestimmten Knoten in einer Datenbank abzuhören. Ein Spiel kann diese Methoden beispielsweise zusammen verwenden, um die Aktivität in den Kommentaren einer Spielsitzung zu überwachen, wie unten gezeigt:

      var ref = FirebaseDatabase.DefaultInstance
      .GetReference("GameSessionComments");

      ref.ChildAdded += HandleChildAdded;
      ref.ChildChanged += HandleChildChanged;
      ref.ChildRemoved += HandleChildRemoved;
      ref.ChildMoved += HandleChildMoved;
    }

    void HandleChildAdded(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildChanged(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildRemoved(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildMoved(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

Das ChildAdded Ereignis wird normalerweise verwendet, um eine Liste von Elementen in einer Firebase-Datenbank abzurufen. Das ChildAdded Ereignis wird einmal für jedes vorhandene ChildAdded und dann jedes Mal, wenn dem angegebenen Pfad ein neues ChildAdded hinzugefügt wird. Dem Listener wird ein Snapshot übergeben, der die Daten des neuen untergeordneten Elements enthält.

Das ChildChanged Ereignis wird jedes Mal ChildChanged wenn ein ChildChanged Knoten geändert wird. Dies schließt alle Änderungen an Nachkommen des untergeordneten Knotens ein. Es wird normalerweise in Verbindung mit den Ereignissen ChildAdded und ChildRemoved verwendet, um auf Änderungen an einer Liste von Elementen zu reagieren. Der an den Ereignis-Listener übergebene Snapshot enthält die aktualisierten Daten für das untergeordnete Element.

Das ChildRemoved Ereignis wird ausgelöst, wenn ein unmittelbar ChildRemoved entfernt wird. Es wird normalerweise in Verbindung mit den Callbacks ChildAdded und ChildChanged . Der an den Ereignisrückruf übergebene Snapshot enthält die Daten für das entfernte untergeordnete Element.

Das ChildMoved Ereignis wird immer dann ausgelöst, wenn das ChildChanged Ereignis von einer Aktualisierung ausgelöst wird, die eine Neuordnung des ChildChanged verursacht. Es wird mit Daten verwendet, die mit OrderByChild oder OrderByValue .

Daten sortieren und filtern

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

Sie können jeweils nur eine Bestellmethode verwenden. Das mehrmalige Aufrufen einer order-by-Methode in derselben Abfrage führt zu einem Fehler.

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

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders").OrderByChild("score")
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

Dies definiert eine Abfrage, die in Kombination mit einem valuechanged-Ereignis-Listener den Client mit der Bestenliste in der Datenbank synchronisiert, geordnet nach der Punktzahl jedes Eintrags. Weitere Informationen zur effizienten Strukturierung Ihrer Daten finden Sie in Strukturieren Sie Ihre Datenbank .

Der Aufruf der Methode OrderByChild() gibt den OrderByChild() Schlüssel an, nach dem die Ergebnisse sortiert werden. In diesem Fall werden die Ergebnisse nach dem Wert des "score" -Werts in jedem Kind sortiert. Weitere Informationen zum Sortieren anderer Datentypen finden Sie unter Sortieren von Abfragedaten .

Daten filtern

Um Daten zu filtern, können Sie beim Erstellen einer Abfrage jede der Methoden limit oder range 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 sollen.
LimitToLast() Legt die maximale Anzahl von Elementen fest, die vom Ende der geordneten Ergebnisliste zurückgegeben werden.
StartAt() Geben Sie Elemente zurück, die größer oder gleich dem angegebenen Schlüssel oder Wert sind, abhängig von der ausgewählten Sortiermethode.
EndAt() Geben Sie Elemente zurück, die kleiner oder gleich dem angegebenen Schlüssel oder Wert sind, abhängig von der ausgewählten Sortiermethode.
EqualTo() Geben Sie Elemente zurück, die dem angegebenen Schlüssel oder Wert entsprechen, abhängig von der ausgewählten Sortiermethode.

Im Gegensatz zu den Sortiermethoden 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.

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

Begrenzen Sie die Anzahl der Ergebnisse

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

Wenn sich Elemente ändern, erhalten Sie ChildAdded Callbacks für Elemente, die in die Abfrage eingehen, und ChildRemoved Callbacks für Elemente, die aus ihr herausfallen, sodass die Gesamtzahl bei 100 bleibt.

Der folgende Code gibt beispielsweise die höchste Punktzahl aus einer Bestenliste zurück:

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders").OrderByChild("score").LimitToLast(1)
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

Nach Schlüssel oder Wert filtern

Sie können StartAt() , EndAt() und EqualTo() , 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.

So werden Abfragedaten geordnet

In diesem Abschnitt wird erläutert, wie Daten nach jeder der order-by-Methoden 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 kommen zuerst.
  2. Als nächstes kommen untergeordnete Elemente mit dem Wert false für den angegebenen untergeordneten Schlüssel. Wenn mehrere Kinder den Wert false , 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 , werden sie lexikografisch nach Schlüssel sortiert.
  4. Als nächstes folgen Kinder mit einem numerischen Wert, sortiert in aufsteigender Reihenfolge. Wenn mehrere untergeordnete Knoten denselben numerischen Wert für den angegebenen untergeordneten Knoten haben, werden sie nach dem Schlüssel sortiert.
  5. Strings kommen nach Zahlen und werden lexikographisch aufsteigend sortiert. Wenn mehrere Kinder denselben Wert für den angegebenen Kindknoten haben, werden sie lexikografisch nach Schlüssel sortiert.
  6. Objekte stehen an letzter Stelle und werden lexikographisch 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. Als nächstes kommen Kinder mit einem String-Wert als Schlüssel, lexikographisch in aufsteigender Reihenfolge sortiert.

OrderByValue

Bei der Verwendung von OrderByValue() werden OrderByValue() 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.