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

Lesen und Schreiben von Daten 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 :

// Get a reference to the database service
var database = firebase.database();

Daten lesen und schreiben

Dieses Dokument behandelt die Grundlagen des Abrufs von Daten sowie das Bestellen und Filtern von Firebase-Daten.

Firebase-Daten werden abgerufen, indem ein asynchroner Listener an eine firebase.database.Reference . Der Listener wird einmal für den Anfangszustand der Daten und immer wieder ausgelöst, wenn sich die Daten ändern.

Grundlegende Schreibvorgänge

Für grundlegende Schreibvorgänge können Sie set() , um Daten in einer angegebenen Referenz zu speichern und vorhandene Daten in diesem Pfad zu ersetzen. Beispielsweise kann eine Social-Blogging-Anwendung einen Benutzer mit set() wie folgt hinzufügen:

function writeUserData(userId, name, email, imageUrl) {
  firebase.database().ref('users/' + userId).set({
    username: name,
    email: email,
    profile_picture : imageUrl
  });
}

Mit set() Daten am angegebenen Speicherort überschrieben, einschließlich aller untergeordneten Knoten.

Achten Sie auf Wertereignisse

Verwenden Sie die Methoden on() oder once() von firebase.database.Reference , um Daten zu beobachten und auf Änderungen zu warten und auf Änderungen zu firebase.database.Reference .

Veranstaltung Typische Verwendung
value Lesen und warten Sie auf Änderungen am gesamten Inhalt eines Pfads.

Sie können die Verwendung value Ereignis eine statische Momentaufnahme der Inhalte zu einem bestimmten Pfad zu lesen, da sie zum Zeitpunkt der Veranstaltung bestanden. Diese Methode wird einmal ausgelöst, wenn der Listener angehängt ist, und jedes Mal, wenn sich die Daten, einschließlich untergeordneter Daten, ändern. Dem Ereignisrückruf wird ein Snapshot übergeben, der alle Daten an diesem Speicherort enthält, einschließlich untergeordneter Daten. Wenn keine Daten vorhanden sind, gibt der Snapshot false wenn Sie exists() aufrufen exists() und null wenn Sie val() aufrufen.

Das folgende Beispiel zeigt eine Social-Blogging-Anwendung, die die Anzahl der Sterne eines Posts aus der Datenbank abruft:

var starCountRef = firebase.database().ref('posts/' + postId + '/starCount');
starCountRef.on('value', function(snapshot) {
  updateStarCount(postElement, snapshot.val());
});

Der Listener erhält einen snapshot , der die Daten zum Zeitpunkt des Ereignisses am angegebenen Speicherort in der Datenbank enthält. Sie können die Daten im snapshot mit der Methode val() abrufen.

Daten einmal lesen

In einigen Fällen möchten Sie möglicherweise eine Momentaufnahme Ihrer Daten, ohne auf Änderungen zu achten, z. B. beim Initialisieren eines UI-Elements, dessen Änderung Sie nicht erwarten. Sie können die once() -Methode verwenden, um dieses Szenario zu vereinfachen: Sie wird einmal ausgelöst und dann nicht erneut.

Dies ist nützlich für Daten, die nur einmal geladen werden müssen und sich voraussichtlich nicht häufig ändern oder aktives Abhören erfordern. Beispielsweise verwendet die Blogging-App in den vorherigen Beispielen diese Methode, um das Profil eines Benutzers zu laden, wenn dieser mit dem Verfassen eines neuen Beitrags beginnt:

var userId = firebase.auth().currentUser.uid;
return firebase.database().ref('/users/' + userId).once('value').then(function(snapshot) {
  var username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
  // ...
});

Aktualisieren oder Löschen von Daten

Aktualisieren Sie bestimmte Felder

Verwenden Sie die update() -Methode, um gleichzeitig in bestimmte untergeordnete Knoten eines Knotens zu schreiben, ohne andere untergeordnete Knoten zu überschreiben.

Wenn Sie update() aufrufen, können Sie untergeordnete Werte auf niedrigerer Ebene aktualisieren, indem Sie einen Pfad für den Schlüssel angeben. Wenn Daten zur besseren Skalierung an mehreren Orten gespeichert werden, können Sie alle Instanzen dieser Daten mithilfe des Daten-Fan-Outs aktualisieren.

Beispielsweise kann eine Social-Blogging-App einen Beitrag erstellen und ihn gleichzeitig mit dem folgenden Code auf den letzten Aktivitäts-Feed und den Aktivitäts-Feed des Posting-Benutzers aktualisieren:

function writeNewPost(uid, username, picture, title, body) {
  // A post entry.
  var postData = {
    author: username,
    uid: uid,
    body: body,
    title: title,
    starCount: 0,
    authorPic: picture
  };

  // Get a key for a new Post.
  var newPostKey = firebase.database().ref().child('posts').push().key;

  // Write the new post's data simultaneously in the posts list and the user's post list.
  var updates = {};
  updates['/posts/' + newPostKey] = postData;
  updates['/user-posts/' + uid + '/' + newPostKey] = postData;

  return firebase.database().ref().update(updates);
}

In diesem Beispiel wird push() , um einen Beitrag im Knoten zu erstellen, der Beiträge für alle Benutzer unter /posts/$postid und gleichzeitig den Schlüssel abzurufen. Der Schlüssel kann dann verwendet werden, um einen zweiten Eintrag in den Posts des Benutzers unter /user-posts/$userid/$postid .

Mithilfe dieser Pfade können Sie mit einem einzigen Aufruf von update() gleichzeitig Aktualisierungen an mehreren Speicherorten in der JSON-Struktur durchführen, z. B. wie in diesem Beispiel der neue Beitrag an beiden Speicherorten erstellt wird. Auf diese Weise vorgenommene gleichzeitige Aktualisierungen sind atomar: Entweder sind alle Aktualisierungen erfolgreich oder alle Aktualisierungen schlagen fehl.

Fügen Sie einen Abschlussrückruf hinzu

Wenn Sie wissen möchten, wann Ihre Daten festgeschrieben wurden, können Sie einen Abschlussrückruf hinzufügen. Sowohl set() als auch update() nehmen einen optionalen Abschlussrückruf entgegen, der aufgerufen wird, wenn der Schreibvorgang in die Datenbank übernommen wurde. Wenn der Anruf nicht erfolgreich war, wird dem Rückruf ein Fehlerobjekt übergeben, das angibt, warum der Fehler aufgetreten ist.

  firebase.database().ref('users/' + userId).set({
    username: name,
    email: email,
    profile_picture : imageUrl
  }, function(error) {
    if (error) {
      // The write failed...
    } else {
      // Data saved successfully!
    }
  });
}

Daten löschen

Der einfachste Weg, Daten zu löschen, besteht darin, remove() für einen Verweis auf den Speicherort dieser Daten aufzurufen.

Sie können auch löschen, indem Sie null als Wert für eine andere Schreiboperation wie set() oder update() . Mit dieser Technik können Sie mit update() mehrere untergeordnete Elemente in einem einzigen API-Aufruf löschen.

Erhalte ein Promise

Um zu erfahren, wann Ihre Daten auf dem Firebase Realtime Database-Server festgeschrieben werden, können Sie ein Promise . Sowohl set() als auch update() können ein Promise Sie feststellen können, wann der Schreibvorgang in die Datenbank übernommen wird.

Hörer abnehmen

Rückrufe werden durch Aufrufen der Methode off() 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.

Daten als Transaktionen speichern

Wenn Sie mit Daten arbeiten, die durch gleichzeitige Änderungen beschädigt werden könnten, z. B. inkrementelle Zähler, können Sie eine Transaktionsoperation verwenden . Sie können dieser Operation eine Aktualisierungsfunktion und einen optionalen Abschlussrückruf geben. Die Aktualisierungsfunktion verwendet den aktuellen Status der Daten als Argument und gibt den neuen gewünschten Status zurück, den Sie schreiben möchten. Wenn ein anderer Client an den Speicherort schreibt, bevor Ihr neuer Wert erfolgreich geschrieben wurde, wird Ihre Aktualisierungsfunktion mit dem neuen aktuellen Wert erneut aufgerufen und der Schreibvorgang wird wiederholt.

In der Beispiel-App für soziales Bloggen können Sie Benutzern beispielsweise erlauben, Beiträge zu markieren und zu entfernen und zu verfolgen, wie viele Sterne ein Beitrag wie folgt erhalten hat:

function toggleStar(postRef, uid) {
  postRef.transaction(function(post) {
    if (post) {
      if (post.stars && post.stars[uid]) {
        post.starCount--;
        post.stars[uid] = null;
      } else {
        post.starCount++;
        if (!post.stars) {
          post.stars = {};
        }
        post.stars[uid] = true;
      }
    }
    return post;
  });
}

Durch die Verwendung einer Transaktion wird verhindert, dass die Anzahl der Sterne falsch ist, wenn mehrere Benutzer denselben Beitrag gleichzeitig markieren oder der Client veraltete Daten hat. Wenn die Transaktion abgelehnt wird, gibt der Server den aktuellen Wert an den Client zurück, der die Transaktion mit dem aktualisierten Wert erneut ausführt. Dies wird wiederholt, bis die Transaktion akzeptiert wird oder Sie die Transaktion abbrechen.

Daten offline schreiben

Wenn ein Client seine Netzwerkverbindung verliert, funktioniert Ihre App weiterhin ordnungsgemäß.

Jeder mit einer Firebase-Datenbank verbundene Client verwaltet seine eigene interne Version aller aktiven Daten. Wenn Daten geschrieben werden, werden sie zuerst in diese lokale Version geschrieben. Der Firebase-Client synchronisiert diese Daten dann mit den Remote-Datenbankservern und mit anderen Clients auf "Best-Effort" -Basis.

Infolgedessen lösen alle Schreibvorgänge in die Datenbank sofort lokale Ereignisse aus, bevor Daten auf den Server geschrieben werden. Dies bedeutet, dass Ihre App unabhängig von Netzwerklatenz oder Konnektivität reagiert.

Sobald die Konnektivität wiederhergestellt ist, empfängt Ihre App die entsprechenden Ereignisse, sodass der Client mit dem aktuellen Serverstatus synchronisiert wird, ohne dass benutzerdefinierter Code geschrieben werden muss.

Nächste Schritte