Dieses Dokument behandelt die Grundlagen zum Abrufen von Daten und zum Sortieren und Filtern von Firebase-Daten.
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 Firebase bereits 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 das Firebase Unity SDK (insbesondere
FirebaseDatabase.unitypackage
) zu Ihrem Unity-Projekt 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 (Sie laden beispielsweise 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 Anfügen an ein Ereignis in einer FirebaseDatabase
Referenz abgerufen. Der Ereignis-Listener wird einmal für den Anfangszustand der Daten aufgerufen und erneut, wenn sich die Daten ändern.
Holen Sie sich eine Datenbankreferenz
Um Daten aus der Datenbank zu lesen, benötigen 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 GetValueAsync
Methode verwenden, um eine statische Momentaufnahme der Inhalte in 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
.
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... } });
Hören Sie auf Ereignisse
Sie können Ereignis-Listener hinzufügen, um Datenänderungen zu abonnieren:
Fall | 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. Vorgeschlagene Verwendung mit ChildChanged und ChildRemoved , um Änderungen an Listen zu überwachen. |
ChildChanged | Überwachen Sie Änderungen an den Elementen in einer Liste. Mit ChildAdded und ChildRemoved verwenden, um Änderungen an Listen zu überwachen. |
ChildRemoved | Listen Sie auf Elemente, die aus einer Liste entfernt werden. Mit ChildAdded und ChildChanged verwenden, um Änderungen an Listen zu überwachen. |
ChildMoved | Überwachen Sie Änderungen an der Reihenfolge der Elemente in einer geordneten Liste. ChildMoved Ereignisse folgen immer auf das ChildChanged Ereignis, das die Änderung der Artikelreihenfolge verursacht hat (basierend auf Ihrer aktuellen Sortiermethode). |
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 angefügt wird, und jedes Mal, wenn sich die Daten, einschließlich der untergeordneten Elemente, ändern. Dem Ereignis-Callback 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, das die Punktzahlen einer Rangliste 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 an der angegebenen Position in der Datenbank zum Zeitpunkt des Ereignisses enthält. Der Aufruf von Value
für einen Snapshot gibt ein Dictionary<string, object>
zurück, das die Daten darstellt. Wenn am Speicherort keine Daten vorhanden sind, gibt der Aufruf von Value
null
zurück.
In diesem Beispiel wird auch args.DatabaseError
untersucht, um festzustellen, ob der Lesevorgang abgebrochen wurde. Beispielsweise kann ein Lesevorgang 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. }
Kinderereignisse
Untergeordnete Ereignisse werden als Reaktion auf bestimmte Vorgänge ausgelöst, die mit den untergeordneten Knoten eines Knotens von einem Vorgang ausgeführt werden, z. B. ein neues untergeordnetes Element, das über die Push()
Methode hinzugefügt wird, oder ein untergeordnetes Element, das über die UpdateChildrenAsync()
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:
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 untergeordnete Element ausgelöst und 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.
Das ChildChanged
Ereignis wird jedes Mal ausgelöst, 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 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 untergeordnetes Element entfernt wird. Es wird normalerweise in Verbindung mit den Callbacks ChildAdded
und ChildChanged
verwendet. 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 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.
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 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 ChildAdded
Callbacks. Wenn Sie weniger als 100 Elemente in Ihrer Firebase-Datenbank gespeichert haben, wird für jedes Element ein ChildAdded
Callback ausgelöst.
Wenn sich Elemente ändern, erhalten Sie ChildAdded
Callbacks für Elemente, die in die Abfrage aufgenommen werden, und ChildRemoved
Callbacks für Elemente, die daraus 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 }
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:
- Kinder mit einem
null
für den angegebenen untergeordneten Schlüssel kommen zuerst. - Als nächstes kommen Kinder mit dem Wert
false
für den angegebenen untergeordneten Schlüssel. Wenn mehrere Kinder den Wertfalse
haben, werden sie lexikografisch nach Schlüssel sortiert. - Als nächstes kommen Kinder mit dem Wert
true
für den angegebenen untergeordneten Schlüssel. Wenn mehrere Kinder den Werttrue
haben, werden sie lexikografisch nach Schlüssel sortiert. - 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.
- 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.
- 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.
- Kinder mit einem Schlüssel, der als 32-Bit-Ganzzahl geparst werden kann, kommen zuerst, sortiert in aufsteigender Reihenfolge.
- 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.