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 verwenden können , Realtime - Datenbank , 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 nicht über ein Unity - Projekt haben, können Sie eine Download - Beispielanwendung .

  • Fügen Sie die Firebase Unity SDK (genauer gesagt, FirebaseDatabase.unitypackage ) , um Ihre Unity - Projekt.

Beachten Sie, dass das Hinzufügen Firebase zu Ihrer Unity Projektaufgabe beinhaltet sowohl in der Firebase - Konsole und in Ihrem geöffneten Projekt Unity (zum Beispiel downloaden Sie Config - Dateien Firebase aus der Konsole, dann in der Unity - Projekt bewegen).

Abrufen von Daten

Feuerbasis Daten werden entweder durch einen einmaligen Aufruf GetValueAsync () oder Anbringen auf ein Ereignis auf einer abgerufenen FirebaseDatabase Referenz. 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, müssen Sie eine Instanz von DatabaseReference :

using Firebase;
using Firebase.Database;
using Firebase.Extensions.TaskExtension; // for ContinueWithOnMainThread

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 Verwendung GetValueAsync Methode einmal eine statische Momentaufnahme der Inhalte zu 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 Snapshot zurück null .

    FirebaseDatabase.DefaultInstance
      .GetReference("Leaders")
      .GetValueAsync().ContinueWithOnMainThread(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:

Vorfall 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. Empfohlene Verwendung mit ChildChanged und ChildRemoved Änderungen an Listen zu überwachen.
ChildChanged Achten Sie auf Änderungen an den Elementen in einer Liste. Verwendung mit ChildAdded und ChildRemoved Änderungen an Listen zu überwachen.
ChildRemoved Achten Sie darauf, dass Elemente aus einer Liste entfernt werden. Verwendung mit ChildAdded und ChildChanged Änderungen an Listen zu überwachen.
ChildMoved Achten Sie auf Änderungen an der Reihenfolge der Elemente in einer geordneten Liste. ChildMoved Ereignisse , die immer folgen ChildChanged Fall , dass die Sache des um Änderung verursacht (basierend auf Ihrem aktuellen Order-by - Methode).

ValueChanged-Ereignis

Sie können die Verwendung ValueChanged Ereignisses auf Änderungen des Inhalts zu 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 Snapshot zurück 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 eine DataSnapshot , die die Daten an der angegebenen Stelle in der Datenbank zum Zeitpunkt des Ereignisses enthält. Der Aufruf Value auf einen Schnappschuss gibt eine Dictionary<string, object> die Daten darstellt. Wenn keine Daten an der Stelle vorhanden ist , ruft Value zurückkehrt null .

In diesem Beispiel args.DatabaseError ist auch , wenn die Lese abgebrochen , um zu sehen untersucht wird. Ein Lesevorgang kann beispielsweise abgebrochen werden, wenn der Client keine Berechtigung zum Lesen von einem Firebase-Datenbankspeicherort hat. Die DatabaseError zeigt an, warum der Fehler aufgetreten ist .

Sie können später von der Veranstaltung abmelden jede Verwendung DatabaseReference , die den gleichen Weg hat. DatabaseReference Instanzen sind kurzlebig und kann als eine Art und Weise gedacht werden jeden Pfad und Abfrage zuzugreifen.

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

Kinderveranstaltungen

Kinderveranstaltungen werden in Reaktion auf bestimmte Vorgänge ausgelöst, die auf die Kinder eines Knotens aus einer Operation passieren wie ein neues Kind durch die zusätzlichen Push() Methode oder ein Kind zu sein, die aktualisierte UpdateChildrenAsync() Methode. 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
    }

Die ChildAdded Ereignis wird normalerweise verwendet , um eine Liste der Elemente in einer Firebase - Datenbank abzurufen. Das ChildAdded Ereignis wird einmal für jedes bestehendes Kind erhöht und dann wieder jedes Mal , wenn ein neues Kind auf den angegebenen Pfad hinzugefügt wird. Dem Listener wird ein Snapshot übergeben, der die Daten des neuen untergeordneten Elements enthält.

Das ChildChanged Ereignis wird ausgelöst , ein Kind Knoten jederzeit geändert wird . Dies schließt alle Änderungen an Nachkommen des untergeordneten Knotens ein. Es wird in der Regel in Verbindung mit den verwendeten ChildAdded und ChildRemoved Ereignissen , um Änderungen an eine 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 sofortiges Kind entfernt wird. Es wird in der Regel in Verbindung mit den verwendeten ChildAdded und ChildChanged Rückrufe. Der an den Ereignisrückruf übergebene Snapshot enthält die Daten für das entfernte untergeordnete Element.

Das ChildMoved Ereignis ausgelöst wird , wenn das ChildChanged Ereignis durch ein Update erhöht wird , die des Kindes verursacht Nachbestellung. Es wird mit Daten verwendet , die mit bestellt OrderByChild oder OrderByValue .

Daten sortieren und filtern

Sie können die Echtzeitdatenbank verwenden Query Klasse , um Daten von Schlüssel sortiert abrufen, nach Wert, oder durch einen Wert eines Kindes. 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 Verwendungszweck
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 nur zu einem Zeitpunkt eine Order-by - Methode 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 , dass , wenn sie mit einem kombinierten Value Ereignis - Listener synchronisiert den Client mit der Rangliste in der Datenbank, durch die Partitur von jedem Eintrag bestellt. Sie können mehr lesen in Ihre Daten effizient zu strukturieren Ihre Datenbankstruktur .

Der Aufruf der OrderByChild() Methode gibt die Tochterschlüssel , die Ergebnisse zu bestellen durch. In diesem Fall werden die Ergebnisse durch den Wert des sortierten "score" Wertes in jedem Kind. Weitere Informationen darüber , wie andere Datentypen bestellt werden, siehe Wie Abfragedaten bestellt wird .

Daten filtern

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

Methode Verwendungszweck
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. Zum Beispiel können Sie die kombinieren StartAt() und EndAt() Methoden , um die Ergebnisse auf einen bestimmten Bereich von Werten zu begrenzen.

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 Verwendung LimitToFirst() und LimitToLast() Methoden , um eine maximale Anzahl von Kindern setzen für einen bestimmten Rückruf synchronisiert werden. Zum Beispiel, wenn Sie verwenden LimitToFirst() ein Limit von 100, einstellen erhalten Sie zunächst nur bis zu 100 ChildAdded Rückrufe. Wenn Sie weniger als 100 in Ihrer Firebase Datenbank gespeicherten Elemente, ein ChildAdded Rückruf Feuer für jedes Element.

Als Elemente zu ändern, erhalten Sie ChildAdded Rückrufe für Elemente , die die Abfrage und geben Sie ChildRemoved Rückrufe für Gegenstände , die so davon fallen aus , dass die Gesamtzahl bleibt bei 100.

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 mit StartAt() , EndAt() und EqualTo() beliebigen Start wählen, am Ende, und Equivalenzpunkte für Abfragen. 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 beschrieben , wie Daten , die von jedem des auftrags durch Verfahren in der sortiert wird Query

OrderByChild

Bei der Verwendung von OrderByChild() , Daten , die der angegebene untergeordnete Schlüssel enthalten geordnet ist wie folgt:

  1. Kinder mit einem null - Wert für den angegebenen Schlüssel Kind an erster Stelle .
  2. Kinder mit einem Wert von false für den angegebenen Kind Schlüssel als nächstes kommen. Wenn mehrere Kinder einen Wert von false , werden sie sortiert lexikographisch durch Schlüssel.
  3. Kinder mit einem Wert von true für den angegebenen Kind Schlüssel als nächstes kommen. Wenn mehrere Kinder einen Wert von true , sie sind lexikographisch 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

Bei der Verwendung von OrderByKey() Ihre Daten zu sortieren, werden die Daten zurückgegeben , um durch Schlüssel in steigend.

  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 aufsteigend sortiert.

OrderByValue

Bei der Verwendung von OrderByValue() werden die Kinder von ihrem Wert bestellt. Die Ordnungskriterien sind die gleichen wie in OrderByChild() , außer der Wert des Knotens anstelle des Wertes eines bestimmten untergeordneten Schlüssel verwendet wird.