Diese Seite wurde von der Cloud Translation API übersetzt.
Switch to English

Arbeiten Sie mit Datenlisten im Web

Holen Sie sich eine Datenbankreferenz

Zum Lesen oder Schreiben von Daten aus der Datenbank benötigen Sie eine Instanz von firebase.database.Reference :

Web v8

var database = firebase.database();

Web v9

import { getDatabase } from "firebase/database";

const database = getDatabase();

Listen lesen und schreiben

An eine Datenliste anhängen

Verwenden Sie die push() -Methode, um Daten in Mehrbenutzeranwendungen an eine Liste anzuhängen. Die push() -Methode generiert jedes Mal einen eindeutigen Schlüssel, wenn der angegebenen Firebase-Referenz ein neues untergeordnetes Element 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 zum selben Speicherort hinzufügen. Der von push() generierte eindeutige Schlüssel basiert auf einem Zeitstempel, sodass Listenelemente automatisch chronologisch sortiert werden.

Sie können den Verweis auf die neuen Daten verwenden, die von der push() -Methode zurückgegeben werden, um den Wert des automatisch generierten Schlüssels des Kindes abzurufen oder Daten für das Kind festzulegen. Die .key Eigenschaft einer push() Referenz enthält den automatisch generierten Schlüssel.

Mit diesen automatisch generierten Schlüsseln können Sie das Reduzieren Ihrer Datenstruktur vereinfachen. Weitere Informationen finden Sie im Beispiel zum Auffächern von Daten.

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

Web v8

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

Web v9

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, {
    // ...
});

Hören Sie auf untergeordnete Ereignisse

Untergeordnete Ereignisse werden als Reaktion auf bestimmte Vorgänge ausgelöst, die den untergeordneten Elementen eines Knotens durch eine Operation passieren, z. B. ein neues untergeordnetes Element, das über die push() -Methode hinzugefügt wurde, oder ein untergeordnetes Element, das über die update() -Methode update() wird.

Veranstaltung Typische Verwendung
child_added Rufen Sie Listen mit Elementen ab oder warten Sie auf Ergänzungen zu einer Liste mit Elementen. Dieses Ereignis wird einmal für jedes vorhandene untergeordnete Element und dann jedes Mal erneut ausgelöst, wenn dem angegebenen Pfad ein neues untergeordnetes Element hinzugefügt wird. Dem Listener wird ein Snapshot übergeben, der die Daten des neuen Kindes 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 auf Elemente, die aus einer Liste entfernt werden. Dieses Ereignis wird ausgelöst, wenn ein unmittelbares 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 in der Reihenfolge der Artikel in einer geordneten Liste. child_moved Ereignisse folgen immer dem child_changed Ereignis, durch das sich die Reihenfolge des Elements geändert hat (basierend auf Ihrer aktuellen Bestellmethode).

Jedes dieser Elemente zusammen kann 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 Posts zu überwachen, wie unten gezeigt:

Web v8

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);
});

Web v9

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);
});

Achten Sie auf Wertereignisse

Während das Abhören von untergeordneten Ereignissen die empfohlene Methode zum Lesen von Datenlisten ist, ist es hilfreich, auf Wertereignisse in einer Listenreferenz zu warten.

Wenn Sie einen Wertbeobachter an eine value anhängen, wird die gesamte Datenliste als einzelner Snapshot zurückgegeben, den Sie dann durchlaufen können, um auf einzelne untergeordnete Elemente zuzugreifen.

Selbst wenn es nur eine einzige Übereinstimmung für die Abfrage gibt, ist der Schnappschuss immer noch eine Liste. Es enthält nur einen einzelnen Artikel. Um auf das Element zuzugreifen, müssen Sie das Ergebnis durchlaufen:

Web v8

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

Web v9

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
});

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

Mit der Realtime Database Query Klasse können Sie Daten abrufen, die nach Schlüssel, Wert oder Wert eines untergeordneten Query 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() Ordnen Sie die Ergebnisse nach dem Wert eines angegebenen untergeordneten Schlüssels oder eines verschachtelten untergeordneten Pfads.
orderByKey() Bestellen Sie die Ergebnisse nach untergeordneten Schlüsseln.
orderByValue() Ordnen Sie die Ergebnisse nach untergeordneten Werten.

Sie können jeweils nur eine Bestellmethode verwenden. Das mehrmalige Aufrufen einer Order-by-Methode in derselben Abfrage löst einen Fehler aus.

Das folgende Beispiel zeigt, wie Sie eine Liste der Top-Beiträge eines Benutzers abrufen können, sortiert nach der Anzahl der Sterne:

Web v8

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

Web v9

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'));

Dies definiert eine Abfrage, die in Kombination mit einem untergeordneten Listener den Client mit den Posts des Benutzers aus dem Pfad in der Datenbank basierend auf seiner Benutzer-ID synchronisiert, sortiert nach der Anzahl der Sterne, die jeder Post erhalten hat. Diese Technik der Verwendung von IDs als Indexschlüssel wird als Datenfächer bezeichnet. Weitere Informationen finden Sie unter Strukturieren Ihrer Datenbank .

Der Aufruf der orderByChild() -Methode gibt den orderByChild() Schlüssel an, nach dem die Ergebnisse sortiert werden sollen. In diesem Fall werden Beiträge nach dem Wert ihres jeweiligen "starCount" sortiert. Abfragen können auch von verschachtelten untergeordneten Elementen sortiert werden, falls Sie Daten haben, die folgendermaßen 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.

Web v8

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

Web v9

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

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

Weitere Informationen zum Bestellen anderer Datentypen finden Sie unter Bestellen von Abfragedaten .

Daten filtern

Um Daten zu filtern, können Sie beim Erstellen einer Abfrage eine der Grenzwert- oder Bereichsmethoden mit einer Sortiermethode kombinieren.

Methode Verwendung
limitToFirst() Legt die maximale Anzahl von Elementen fest, die ab dem Anfang der geordneten Ergebnisliste zurückgegeben werden sollen.
limitToLast() Legt die maximale Anzahl von Elementen fest, die am Ende der geordneten Ergebnisliste zurückgegeben werden sollen.
startAt() Geben Sie Elemente zurück, die größer oder gleich dem angegebenen Schlüssel oder Wert sind, abhängig von der gewählten Bestellmethode.
startAfter() Gibt Elemente zurück, die größer als der angegebene Schlüssel oder Wert sind, abhängig von der gewählten Bestellmethode.
endAt() Geben Sie Artikel zurück, die kleiner oder gleich dem angegebenen Schlüssel oder Wert sind, abhängig von der gewählten Bestellmethode.
endBefore() Geben Sie je nach gewählter Bestellmethode weniger als den angegebenen Schlüssel oder Wert zurück.
equalTo() Gibt Elemente zurück, die dem angegebenen Schlüssel oder Wert entsprechen, abhängig von der gewählten Bestellmethode.

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

Begrenzen Sie die Anzahl der Ergebnisse

Mit den limitToFirst() und limitToLast() können Sie eine maximale Anzahl von limitToLast() limitToFirst() limitToLast() , die für ein bestimmtes Ereignis synchronisiert werden sollen. Wenn Sie beispielsweise limitToFirst() , um ein Limit von 100 child_added , erhalten Sie zunächst nur bis zu 100 child_added Ereignisse. Wenn in Ihrer Firebase-Datenbank weniger als 100 Elemente gespeichert sind, wird für jedes Element ein child_added Ereignis child_added .

Wenn sich Elemente ändern, erhalten Sie child_added Ereignisse für Elemente, die in die Abfrage child_removed werden, und child_removed Ereignisse für Elemente, die aus der Abfrage child_removed werden, sodass die Gesamtzahl bei 100 bleibt.

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

Web v8

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

Web v9

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

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

In diesem Beispiel wird nur eine Abfrage definiert, um Daten zu synchronisieren, für die ein Listener erforderlich ist.

Nach Schlüssel oder Wert filtern

Mit startAt() , startAfter() , endAt() , endBefore() und equalTo() Sie beliebige Start-, End- und Äquivalenzpunkte für Abfragen auswählen. Dies kann nützlich sein, um Daten zu paginieren oder Elemente mit Kindern zu finden, die einen bestimmten Wert haben.

Wie werden Abfragedaten bestellt?

In diesem Abschnitt wird erläutert, wie Daten nach den einzelnen Sortiermethoden 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 stehen an erster Stelle.
  2. Als nächstes folgen Kinder mit dem Wert false für den angegebenen untergeordneten Schlüssel. Wenn mehrere Kinder den Wert false , werden sie lexikografisch nach Schlüsseln sortiert.
  3. Als nächstes folgen Kinder mit dem Wert true für den angegebenen untergeordneten Schlüssel. Wenn mehrere Kinder den Wert true , werden sie lexikografisch nach Schlüsseln sortiert.
  4. Als nächstes kommen Kinder mit einem numerischen Wert, aufsteigend sortiert. Wenn mehrere untergeordnete Elemente denselben numerischen Wert für den angegebenen untergeordneten Knoten haben, werden sie nach Schlüsseln sortiert.
  5. Zeichenfolgen stehen nach Zahlen und werden in aufsteigender Reihenfolge lexikografisch sortiert. Wenn mehrere untergeordnete Elemente denselben Wert für den angegebenen untergeordneten Knoten haben, werden sie lexikografisch nach Schlüssel sortiert.
  6. Objekte kommen zuletzt und werden lexikografisch nach Schlüssel in aufsteigender Reihenfolge sortiert.

orderByKey

Wenn orderByKey() Ihre Daten mit orderByKey() sortieren, werden die Daten in aufsteigender Reihenfolge nach Schlüssel zurückgegeben.

  1. Kinder mit einem Schlüssel, der als 32-Bit-Ganzzahl analysiert werden kann, werden zuerst in aufsteigender Reihenfolge sortiert.
  2. Als nächstes folgen Kinder mit einem Zeichenfolgenwert als Schlüssel, die lexikografisch in aufsteigender Reihenfolge sortiert sind.

orderByValue

Bei 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.

Hörer abnehmen

Rückrufe werden durch Aufrufen der off() -Methode in Ihrer Firebase-Datenbankreferenz entfernt.

Sie können einen einzelnen Listener entfernen, indem Sie ihn als Parameter an off() . Wenn Sie off() an dem Speicherort ohne Argumente aufrufen, werden alle Listener an diesem Speicherort entfernt.

Wenn Sie off() für einen übergeordneten Listener aufrufen, werden die auf den untergeordneten Knoten registrierten Listener nicht automatisch entfernt. off() muss auch von allen untergeordneten Listenern aufgerufen werden, um den Rückruf zu entfernen.

Nächste Schritte