Mit Datenlisten im Web arbeiten

Holen Sie sich eine Datenbankreferenz

Zum Lesen oder Schreiben von Daten aus der Datenbank, müssen Sie eine Instanz von firebase.database.Reference :

Webversion 9

import { getDatabase } from "firebase/database";

const database = getDatabase();

Webversion 8

var database = firebase.database();

Listen lesen und schreiben

An eine Datenliste anhängen

Verwenden Sie die push() Methode , um Daten anhängen zu einer Liste im Multi - User - Anwendungen. Die push() Methode generiert einen eindeutigen Schlüssel jedes Mal ein neues Kind auf die angegebene Bezugsfirebase hinzugefügt wird. Durch die Verwendung dieser automatisch generierten Schlüssel für jedes neue Element in der Liste können mehrere Clients gleichzeitig untergeordnete Elemente ohne Schreibkonflikte am selben Speicherort hinzufügen. Der eindeutige Schlüssel durch erzeugte push() wird auf einem Zeitstempel basiert, so dass Listenelemente werden automatisch chronologisch geordnet.

Sie können den Verweis auf die neuen Daten , die von dem zurück verwenden push() Methode den Wert des Kindes automatisch generierten Schlüssel oder eingestellten Daten für das Kind zu bekommen. Die .key Eigenschaft eines push() Referenz enthält , die automatisch generierten Schlüssel.

Sie können diese automatisch generierten Schlüssel verwenden, um die Reduzierung Ihrer Datenstruktur zu vereinfachen. Weitere Informationen finden Sie in die Daten Fanout Beispiel .

Zum Beispiel push() könnte einen neuen Beitrag zu einer Liste von Beiträgen in einer sozialen Anwendung hinzuzufügen verwendet werden:

Webversion 9

import { getDatabase, ref, push, set } from "firebase/database";

// Create a new post reference with an auto-generated id
const db = getDatabase();
const postListRef = ref(db, 'posts');
const newPostRef = push(postListRef);
set(newPostRef, {
    // ...
});

Webversion 8

// Create a new post reference with an auto-generated id
var postListRef = firebase.database().ref('posts');
var newPostRef = postListRef.push();
newPostRef.set({
    // ...
});

Auf Kinderereignisse achten

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 durch die aktualisiert update() Methode.

Vorfall Typische Verwendung
child_added Rufen Sie Listen von Elementen ab oder hören Sie auf Ergänzungen zu einer Liste von Elementen. Dieses Ereignis wird einmal für jedes vorhandene Kind ausgelöst und dann jedes Mal, wenn dem angegebenen Pfad ein neues Kind hinzugefügt wird. Dem Listener wird ein Snapshot übergeben, der die Daten des neuen untergeordneten Elements enthält.
child_changed Achten Sie auf Änderungen an den Elementen in einer Liste. Dieses Ereignis wird jedes Mal ausgelöst, wenn ein untergeordneter Knoten geändert wird. Dies schließt alle Änderungen an Nachkommen des untergeordneten Knotens ein. Der an den Ereignis-Listener übergebene Snapshot enthält die aktualisierten Daten für das untergeordnete Element.
child_removed Achten Sie darauf, dass Elemente aus einer Liste entfernt werden. Dieses Ereignis wird ausgelöst, wenn ein unmittelbar untergeordnetes Element entfernt wird. Der an den Rückrufblock übergebene Snapshot enthält die Daten für das entfernte untergeordnete Element.
child_moved Achten Sie auf Änderungen an der Reihenfolge der Elemente in einer geordneten Liste. child_moved Ereignisse folgen immer dem child_changed Fall , dass die Sache der um Änderung verursacht (basierend auf Ihrer aktuellen Order-by - Methode).

Alle zusammen können nützlich sein, um Änderungen an einem bestimmten Knoten in einer Datenbank abzuhören. Beispielsweise kann eine Social-Blogging-App diese Methoden zusammen verwenden, um die Aktivität in den Kommentaren eines Beitrags zu überwachen, wie unten gezeigt:

Webversion 9

import { getDatabase, ref, onChildAdded, onChildChanged, onChildRemoved } from "firebase/database";

const db = getDatabase();
const commentsRef = ref(db, 'post-comments/' + postId);
onChildAdded(commentsRef, (data) => {
  addCommentElement(postElement, data.key, data.val().text, data.val().author);
});

onChildChanged(commentsRef, (data) => {
  setCommentValues(postElement, data.key, data.val().text, data.val().author);
});

onChildRemoved(commentsRef, (data) => {
  deleteComment(postElement, data.key);
});

Webversion 8

var commentsRef = firebase.database().ref('post-comments/' + postId);
commentsRef.on('child_added', (data) => {
  addCommentElement(postElement, data.key, data.val().text, data.val().author);
});

commentsRef.on('child_changed', (data) => {
  setCommentValues(postElement, data.key, data.val().text, data.val().author);
});

commentsRef.on('child_removed', (data) => {
  deleteComment(postElement, data.key);
});

Auf Wertereignisse achten

Während das Abhören von untergeordneten Ereignissen die empfohlene Methode zum Lesen von Datenlisten ist, gibt es Situationen, in denen das Abhören von Wertereignissen in einer Listenreferenz nützlich ist.

Ein Anbringen value Beobachter auf eine Liste von Daten wird die gesamte Liste der Daten als eine einzelne Momentaufnahme zurückkehren, wo Sie dann die Schleife über den Zugriff auf einzelne Kinder.

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. Um auf das Element zuzugreifen, müssen Sie das Ergebnis durchlaufen:

Webversion 9

import { getDatabase, ref, onValue } from "firebase/database";

const db = getDatabase();
const dbRef = ref(db, '/a/b/c');

onValue(dbRef, (snapshot) => {
  snapshot.forEach((childSnapshot) => {
    const childKey = childSnapshot.key;
    const childData = childSnapshot.val();
    // ...
  });
}, {
  onlyOnce: true
});

Webversion 8

ref.once('value', (snapshot) => {
  snapshot.forEach((childSnapshot) => {
    var childKey = childSnapshot.key;
    var childData = childSnapshot.val();
    // ...
  });
});

Dieses Muster kann nützlich sein, wenn Sie alle untergeordneten Elemente einer Liste in einem einzigen Vorgang abrufen möchten, anstatt auf zusätzliche untergeordnete Ereignisse zu warten.

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 oder verschachtelten untergeordneten Pfads.
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 Liste der Top-Posts eines Benutzers, sortiert nach der Anzahl der Sterne, abrufen können:

Webversion 9

import { getDatabase, ref, query, orderByChild } from "firebase/database";
import { getAuth } from "firebase/auth";

const db = getDatabase();
const auth = getAuth();

const myUserId = auth.currentUser.uid;
const topUserPostsRef = query(ref(db, 'user-posts/' + myUserId), orderByChild('starCount'));

Webversion 8

var myUserId = firebase.auth().currentUser.uid;
var topUserPostsRef = firebase.database().ref('user-posts/' + myUserId).orderByChild('starCount');

Dies definiert eine Abfrage , dass , wenn sie mit einem kombinierten Kind Zuhörers synchronisiert den Client mit der Beiträge des Benutzers von dem Pfad in der Datenbank auf ihre Benutzer - ID basiert, sortiert nach der Anzahl der Sterne jeder Post erhalten hat. Diese Technik der IDs als Indexschlüssel verwendet wird , um Daten auffächern genannt, können Sie mehr darüber in lesen Struktur Ihrer Datenbank .

Der Aufruf der orderByChild() Methode gibt die Tochterschlüssel , die Ergebnisse zu bestellen durch. In diesem Fall werden Beiträge durch den Wert ihrer jeweiligen sortiert "starCount" Kind. Abfragen können auch nach verschachtelten Kindern geordnet werden, falls 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 durch Werte verschachtelt unter der Bestellnummer metrics Schlüssel durch den relativen Pfad zu dem verschachtelten Kind in unserer Angabe orderByChild() Aufruf.

Webversion 9

import { getDatabase, ref, query, orderByChild } from "firebase/database";

const db = getDatabase();
const mostViewedPosts = query(ref(db, 'posts'), orderByChild('metrics/views'));

Webversion 8

var mostViewedPosts = firebase.database().ref('posts').orderByChild('metrics/views');

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() Gibt Elemente zurück, die größer oder gleich dem angegebenen Schlüssel oder Wert sind, abhängig von der ausgewählten Sortiermethode.
startAfter() Gibt Elemente zurück, die je nach gewählter Sortiermethode größer als der angegebene Schlüssel oder Wert sind.
endAt() Geben Sie Elemente zurück, die kleiner oder gleich dem angegebenen Schlüssel oder Wert sind, abhängig von der ausgewählten Sortiermethode.
endBefore() Gibt Elemente zurück, die weniger als den angegebenen Schlüssel oder Wert aufweisen, 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.

Begrenzen Sie die Anzahl der Ergebnisse

Sie können die Verwendung limitToFirst() und limitToLast() Methoden , um eine maximale Anzahl von Kindern setzen für ein bestimmtes Ereignis synchronisiert werden. Zum Beispiel, wenn Sie verwenden limitToFirst() ein Limit von 100 zu setzen erhalten Sie zunächst nur auf 100 bis child_added Veranstaltungen. Wenn Sie weniger als 100 in Ihrer Firebase Datenbank gespeicherten Elemente, ein child_added Ereignis ausgelöst wird für jedes Element.

Als Elemente zu ändern, erhalten Sie child_added Ereignisse für Artikel , die die Abfrage und geben Sie child_removed Ereignisse für Gegenstände , die so davon fallen aus , dass die Gesamtzahl bleibt bei 100.

Das folgende Beispiel zeigt, wie eine Beispiel-Blogging-App eine Abfrage definiert, um eine Liste der 100 neuesten Beiträge aller Benutzer abzurufen:

Webversion 9

import { getDatabase, ref, query, limitToLast } from "firebase/database";

const db = getDatabase();
const recentPostsRef = query(ref(db, 'posts'), limitToLast(100));

Webversion 8

var recentPostsRef = firebase.database().ref('posts').limitToLast(100);

In diesem Beispiel wird nur eine Abfrage, um tatsächlich synchronisieren Daten , die es braucht einen an haben Zuhörer .

Nach Schlüssel oder Wert filtern

Sie können mit startAt() , startAfter() , endAt() , endBefore() und equalTo() beliebigen Start zu 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.

Hörer trennen

Rückrufe werden durch den Aufruf der entfernt off() Methode auf Firebase Datenbank Referenz.

Sie können einen einzelnen Hörer entfernen , indem Sie es als Parameter vorbei off() . Der Aufruf off() auf der Stelle ohne Argumente werden alle Zuhörer an dieser Stelle.

Der Aufruf off() auf einem übergeordneten Hörer nicht automatisch Hörer entfernen auf seinen untergeordneten Knoten registriert ist ; off() muss auch auf alle untergeordneten Hörer aufgerufen werden , um den Rückruf zu entfernen.

Nächste Schritte