Datenbankreferenz abrufen
Zum Lesen oder Schreiben von Daten aus der Datenbank benötigen Sie eine Instanz von
DatabaseReference
:
DatabaseReference ref = FirebaseDatabase.instance.ref();
Listen lesen und schreiben
Daten an eine Datenliste anhängen
Verwenden Sie die Methode push()
, um Daten an eine Liste in Anwendungen mit mehreren Nutzern anzuhängen.
Die Methode push()
generiert jedes Mal einen eindeutigen Schlüssel, wenn ein neues untergeordnetes Element hinzugefügt wird.
die angegebene Firebase-Referenz. Wenn Sie diese automatisch generierten Schlüssel für jedes
Neues Element in der Liste können mehrere Kunden derselben Position untergeordnete Elemente hinzufügen.
gleichzeitig ohne Schreibkonflikte. Der von push()
generierte eindeutige Schlüssel
basiert auf einem Zeitstempel, sodass Listenelemente automatisch
in chronologischer Reihenfolge.
Sie können den Verweis auf die neuen Daten verwenden, die von der Methode push()
zurückgegeben werden, um
Wert des automatisch generierten Schlüssels oder Satzdaten des untergeordneten Elements. Die
Die Eigenschaft .key
einer push()
-Referenz enthält den automatisch generierten Schlüssel.
Mit diesen automatisch generierten Schlüsseln können Sie die Flattening-Datenstruktur vereinfachen. Weitere Informationen finden Sie im Beispiel für das Daten-Fan-out.
Mit push()
kann beispielsweise einer Liste von Beiträgen in einer Social-Media-Anwendung ein neuer Beitrag hinzugefügt werden:
DatabaseReference postListRef = FirebaseDatabase.instance.ref("posts");
DatabaseReference newPostRef = postListRef.push();
newPostRef.set({
// ...
});
Auf untergeordnete Ereignisse warten
Untergeordnete Ereignisse werden als Reaktion auf bestimmte Vorgänge ausgelöst, die bei den untergeordneten Elementen eines Knotens durch einen Vorgang auftreten, z. B. wenn ein neues untergeordnetes Element über die Methode push()
hinzugefügt oder ein untergeordnetes Element über die Methode update()
aktualisiert wird.
Ereignis | Normale Nutzung |
---|---|
onChildAdded |
Rufen Sie Listen von Elementen ab oder achten Sie auf Ergänzungen zu einer Liste von Elementen. Dieses Ereignis wird einmal für jedes vorhandene untergeordnete Element ausgelöst und dann jedes Mal, wenn dem angegebenen Pfad ein neues untergeordnetes Element hinzugefügt wird. Der Listener ist hat einen Snapshot mit den Daten des neuen untergeordneten Elements übergeben. |
onChildChanged |
Auf Änderungen an den Elementen in einer Liste achten Dieses Ereignis wird bei jeder Änderung eines untergeordneten Knotens ausgelöst. Das gilt auch für alle Änderungen an Nachkommen des untergeordneten Knotens. Der an den Ereignis-Listener übergebene Snapshot enthält die aktualisierten Daten für das untergeordnete Element. |
onChildRemoved |
Prüfen, ob Elemente aus einer Liste entfernt werden Dieses Ereignis wird ausgelöst, wenn wird ein unmittelbares untergeordnetes Element entfernt.Der Snapshot, der an den Rückruf-Block übergeben wurde, enthält die Daten für das entfernte untergeordnete Element. |
onChildMoved |
Beobachten von Änderungen an der Reihenfolge der Elemente in einer sortierten Liste Auf das Ereignis „onChildMoved“ folgt immer das Ereignis „onChildChanged“, das die Änderung der Reihenfolge des Elements (basierend auf der aktuellen Sortiermethode) verursacht hat. |
Mit jedem dieser Elemente können Sie Änderungen an einem bestimmten Knoten in einer Datenbank. Diese Methoden können beispielsweise in einer Blog-App für soziale Netzwerke eingesetzt werden. um die Aktivitäten in den Kommentaren zu einem Beitrag zu überwachen:
final commentsRef = FirebaseDatabase.instance.ref("post-comments/$postId");
commentsRef.onChildAdded.listen((event) {
// A new comment has been added, so add it to the displayed list.
});
commentsRef.onChildChanged.listen((event) {
// A comment has changed; use the key to determine if we are displaying this
// comment and if so displayed the changed comment.
});
commentsRef.onChildRemoved.listen((event) {
// A comment has been removed; use the key to determine if we are displaying
// this comment and if so remove it.
});
Auf Wertereignisse warten
Das Abhören von untergeordneten Ereignissen ist die empfohlene Methode zum Lesen von Datenlisten. Es gibt jedoch Situationen, in denen das Abhören von Wertereignissen für eine Listenreferenz nützlich ist.
Wenn Sie einen value
-Listener an eine Datenliste anhängen, wird die
Liste der Daten als eine einzige Momentaufnahme, die Sie dann
auf einzelne Kinder zugreifen.
Auch wenn es nur eine Übereinstimmung für die Suchanfrage gibt, ist der Snapshot immer eine Liste, die nur ein Element enthält. Um auf das Element zuzugreifen, musst du das Ergebnis durchlaufen:
myTopPostsQuery.onValue.listen((event) {
for (final child in event.snapshot.children) {
// Handle the post.
}
}, onError: (error) {
// Error.
});
Dieses Muster kann nützlich sein, wenn Sie alle untergeordneten Elemente einer Liste abrufen möchten in einem einzigen Vorgang durchführen, anstatt auf zusätzliche untergeordnete Elemente zu warten, Ereignisse.
Daten sortieren und filtern
Mit der Klasse Query
können Sie Daten abrufen, die nach folgenden Kriterien sortiert sind:
nach Schlüssel, nach Wert oder nach Wert eines untergeordneten Elements. Sie können auch
das sortierte Ergebnis auf eine bestimmte Anzahl von Ergebnissen, einen Schlüsselbereich oder
Werte.
Daten sortieren
Um sortierte Daten abzurufen, geben Sie zunächst eine der Sortiermethoden an, wie die Ergebnisse sortiert werden:
Methode | Nutzung |
---|---|
orderByChild() |
Ergebnisse nach dem Wert eines bestimmten untergeordneten Schlüssels oder eines verschachtelten untergeordneten Pfads sortieren. |
orderByKey() |
Sortieren Sie die Ergebnisse nach untergeordneten Schlüsseln. |
orderByValue() |
Ergebnisse nach untergeordneten Werten sortieren |
Sie können jeweils nur eine Sortiermethode verwenden. Eine Order-by-Methode aufrufen mehrfach in derselben Abfrage führt zu einem Fehler.
Im folgenden Beispiel wird gezeigt, wie du eine Liste der Top-Beiträge eines Nutzers abrufen kannst, sortiert nach der Anzahl der Sterne:
final myUserId = FirebaseAuth.instance.currentUser?.uid;
final topUserPostsRef = FirebaseDatabase.instance
.ref("user-posts/$myUserId")
.orderByChild("starCount");
Definiert eine Abfrage, die in Kombination mit einem untergeordneten Listener synchronisiert den Client mit den Beiträgen des Nutzers aus dem Pfad in der Datenbank basierend auf der Nutzer-ID, sortiert nach der Anzahl der Sterne, die jeder Beitrag erhalten hat. Diese Methode, IDs als Indexschlüssel zu verwenden, wird als Datenfan-out bezeichnet. Weitere Informationen finden Sie unter Datenbank strukturieren.
Der Aufruf der Methode orderByChild()
gibt den untergeordneten Schlüssel an, nach dem die Ergebnisse sortiert werden sollen. In diesem Fall werden Beiträge nach dem Wert des jeweiligen untergeordneten "starCount"
-Elements sortiert. Abfragen können auch nach verschachtelten
Kinder, wenn Sie Daten haben, die wie folgt aussehen:
"posts": {
"ts-functions": {
"metrics": {
"views" : 1200000,
"likes" : 251000,
"shares": 1200,
},
"title" : "Why you should use TypeScript for writing Cloud Functions",
"author": "Doug",
},
"android-arch-3": {
"metrics": {
"views" : 900000,
"likes" : 117000,
"shares": 144,
},
"title" : "Using Android Architecture Components with Firebase Realtime Database (Part 3)",
"author": "Doug",
}
},
In diesem Fall können wir unsere Listenelemente nach Werten ordnen, die unter der
metrics
durch Angeben des relativen Pfads zum verschachtelten untergeordneten Element in der
Anruf in orderByChild()
.
final mostViewedPosts =
FirebaseDatabase.instance.ref('posts').orderByChild('metrics/views');
Weitere Informationen zur Reihenfolge anderer Datentypen Siehe Reihenfolge der Abfragedaten.
Daten filtern
Zum Filtern von Daten können Sie beliebige Grenzwert- oder Bereichsmethoden mit einem -Methode beim Erstellen einer Abfrage.
Methode | Nutzung |
---|---|
limitToFirst() |
Legt die maximale Anzahl der Elemente fest, die vom Anfang der sortierten Ergebnisliste zurückgegeben werden sollen. |
limitToLast() |
Legt die maximale Anzahl der Artikel fest, die ab dem Ende des bestellten Artikels zurückgegeben werden. Liste der Ergebnisse. |
startAt() |
Gibt Elemente zurück, die größer oder gleich dem angegebenen Schlüssel oder Wert sind abhängig von der gewählten Order-by-Methode. |
startAfter() |
Gibt Elemente zurück, die größer als der angegebene Schlüssel oder Wert sind abhängig von der gewählten Order-by-Methode. |
endAt() |
Gibt Elemente zurück, die kleiner oder gleich dem angegebenen Schlüssel oder Wert sind abhängig von der gewählten Order-by-Methode. |
endBefore() |
Gibt Elemente zurück, die kleiner als der angegebene Schlüssel oder Wert sind abhängig von der gewählten Order-by-Methode. |
equalTo() |
Gibt Elemente zurück, die dem angegebenen Schlüssel oder Wert entsprechen, je nach ausgewählter Sortiermethode. |
Im Gegensatz zu den Sortiermethoden können Sie mehrere Limit- oder Bereichsfunktionen kombinieren.
Sie können beispielsweise die Methoden startAt()
und endAt()
kombinieren, um
in einen bestimmten Wertebereich eingeben.
Anzahl der Ergebnisse begrenzen
Mit den Methoden limitToFirst()
und limitToLast()
können Sie eine maximale Anzahl von untergeordneten Elementen festlegen, die für ein bestimmtes Ereignis synchronisiert werden sollen. Beispiel:
Wenn Sie mit limitToFirst()
ein Limit von 100 festlegen, erhalten Sie anfangs nur
bis 100 onChildAdded
-Ereignisse. Wenn Sie weniger als 100 Elemente in Ihrem
Firebase-Datenbank wird für jedes Element ein onChildAdded
-Ereignis ausgelöst.
Wenn sich Elemente ändern, erhalten Sie onChildAdded
-Ereignisse für Elemente, die den
und onChildRemoved
-Ereignisse für Elemente,
die es verlassen, sodass
bleibt die Gesamtzahl bei 100.
Das folgende Beispiel zeigt, wie in einer Beispiel-Blogging-App eine Abfrage für eine Liste der 100 neuesten Beiträge aller Nutzer abrufen:
final recentPostsRef = FirebaseDatabase.instance.ref('posts').limitToLast(100);
In diesem Beispiel wird nur eine Abfrage definiert. Für die tatsächliche Synchronisierung von Daten muss ein Listener angehängt sein.
Nach Schlüssel oder Wert filtern
Mit startAt()
, startAfter()
, endAt()
, endBefore()
und equalTo()
können Sie beliebige Start-, End- und Äquivalenzpunkte für Abfragen auswählen. Dies kann beim Paginieren von Daten oder beim Suchen von Elementen mit Kindern nützlich sein.
die einen bestimmten Wert haben.
So werden Abfragedaten geordnet
In diesem Abschnitt wird erläutert, wie Daten nach den einzelnen Sortiermethoden im
Klasse Query
.
orderByChild
Bei Verwendung von orderByChild()
werden Daten, die den angegebenen untergeordneten Schlüssel enthalten,
wie folgt sortiert:
- Untergeordnete Elemente mit einem
null
-Wert für den angegebenen untergeordneten Schlüssel werden zuerst angezeigt. - Als Nächstes folgen untergeordnete Elemente mit dem Wert
false
für den angegebenen untergeordneten Schlüssel. Wenn mehrere untergeordnete Elemente den Wertfalse
haben, sind sie lexikografisch nach Schlüssel sortiert. - Untergeordnete Elemente mit dem Wert
true
für den angegebenen untergeordneten Schlüssel als Nächstes kommen. Wenn mehrere untergeordnete Elemente den Werttrue
haben, werden sie nach Schlüssel sortiert. - Als Nächstes folgen untergeordnete Elemente mit einem numerischen Wert, sortiert in aufsteigender Reihenfolge. Wenn mehrere untergeordnete Elemente denselben numerischen Wert für den angegebenen untergeordneten Knoten haben, werden sie nach Schlüssel sortiert.
- Strings folgen den Zahlen und werden alphabetisch in aufsteigender Reihenfolge sortiert. Wenn mehrere untergeordnete Elemente denselben Wert für das angegebene untergeordnete Element haben lexikografisch nach Schlüssel sortiert.
- Objekte kommen an letzter Stelle und werden lexikografisch nach Schlüssel in aufsteigender Reihenfolge sortiert.
orderByKey
Wenn Sie Ihre Daten mit orderByKey()
sortieren, werden sie in aufsteigender Reihenfolge nach Schlüssel zurückgegeben.
- Untergeordnete Elemente mit einem Schlüssel, der als 32‑Bit-Ganzzahl geparst werden kann, werden zuerst in aufsteigender Reihenfolge sortiert.
- Als Nächstes folgen untergeordnete Elemente mit einem Stringwert als Schlüssel, sortiert in aufsteigender lexikografischer Reihenfolge.
orderByValue
Bei Verwendung von orderByValue()
werden untergeordnete Elemente nach ihrem Wert sortiert. Die Sortierkriterien sind dieselben wie in orderByChild()
, mit der Ausnahme, dass der Wert des Knotens anstelle des Werts eines angegebenen untergeordneten Schlüssels verwendet wird.
Listener trennen
Callbacks werden durch Aufrufen der off()
-Methode auf Ihrem
Firebase-Datenbankreferenz
Sie können einen einzelnen Listener entfernen, indem Sie ihn als Parameter an off()
übergeben.
Wenn Sie off()
für den Standort ohne Argumente aufrufen, werden alle Listener an diesem Standort entfernt
Standort.
Das Aufrufen von off()
für einen übergeordneten Listener erfolgt nicht
Listener, die auf den untergeordneten Knoten registriert sind, werden automatisch entfernt.
off()
muss auch für alle untergeordneten Listener aufgerufen werden
um den Callback zu entfernen.