Ta strona została przetłumaczona przez Cloud Translation API.
Switch to English

Odczyt i zapis danych w Internecie

Uzyskaj odniesienie do bazy danych

Aby odczytać lub zapisać dane z bazy danych, potrzebujesz instancji firebase.database.Reference .

var database = firebase.database();

Czytanie i zapisywanie danych

W tym dokumencie omówiono podstawy pobierania danych oraz porządkowanie i filtrowanie danych Firebase.

Dane z Firebase są pobierane przez dołączenie odbiornika asynchronicznego do pliku firebase.database.Reference . Odbiornik jest wyzwalany raz dla początkowego stanu danych i ponownie za każdym razem, gdy dane ulegną zmianie.

Podstawowe operacje zapisu

W przypadku podstawowych operacji zapisu można użyć set() aby zapisać dane do określonego odniesienia, zastępując wszelkie istniejące dane w tej ścieżce. Na przykład aplikacja do blogowania społecznościowego może dodać użytkownika za pomocą funkcji set() w następujący sposób:

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

Użycie set() powoduje nadpisanie danych w określonej lokalizacji, w tym wszystkich węzłów podrzędnych.

Nasłuchuj wartościowych wydarzeń

Aby odczytać dane na ścieżce i nasłuchiwać zmian, użyj metod on() lub once() metody firebase.database.Reference do obserwowania zdarzeń.

Zdarzenie Typowe użycie
value Czytaj i nasłuchuj zmian w całej zawartości ścieżki.

Możesz użyć zdarzenia value , aby odczytać statyczną migawkę zawartości w danej ścieżce, tak jak istniała ona w momencie zdarzenia. Ta metoda jest wyzwalana raz, gdy słuchacz jest dołączony i ponownie za każdym razem, gdy dane, w tym dane podrzędne, ulegają zmianie. Wywołanie zwrotne zdarzenia jest przesyłane jako migawka zawierająca wszystkie dane w tej lokalizacji, w tym dane podrzędne. Jeśli nie ma danych, migawka zwróci wartość false gdy wywołasz exists() i null gdy wywołasz na niej funkcję val() .

Poniższy przykład ilustruje aplikację do obsługi blogów społecznościowych pobierającą liczbę gwiazdek posta z bazy danych:

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

Odbiornik odbiera snapshot która zawiera dane w określonej lokalizacji w bazie danych w momencie zdarzenia. Dane z snapshot można pobrać za pomocą metody val() .

Przeczytaj dane raz

W niektórych przypadkach możesz chcieć uzyskać migawkę danych bez nasłuchiwania zmian, na przykład podczas inicjowania elementu interfejsu użytkownika, którego nie spodziewasz się zmienić. Aby uprościć ten scenariusz, możesz użyć metody once() : uruchamia się ona raz, a następnie nie uruchamia się ponownie.

Jest to przydatne w przypadku danych, które trzeba załadować tylko raz i nie powinny się często zmieniać lub wymagają aktywnego nasłuchiwania. Na przykład aplikacja do blogowania w poprzednich przykładach używa tej metody do załadowania profilu użytkownika, gdy zaczyna on tworzyć nowy post:

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

Aktualizacja lub usuwanie danych

Zaktualizuj określone pola

Aby jednocześnie pisać do określonych elementów podrzędnych węzła bez nadpisywania innych węzłów podrzędnych, użyj metody update() .

W przypadku wywołania metody update() można zaktualizować wartości podrzędne niższego poziomu, określając ścieżkę do klucza. Jeśli dane są przechowywane w wielu lokalizacjach w celu lepszego skalowania, możesz zaktualizować wszystkie wystąpienia tych danych za pomocą rozpowszechniania danych .

Na przykład aplikacja do obsługi blogów społecznościowych może utworzyć post i jednocześnie zaktualizować go do kanału ostatniej aktywności i kanału aktywności użytkownika publikującego za pomocą następującego kodu:

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

W tym przykładzie funkcja push() służy do tworzenia wiadomości w węźle zawierającej wiadomości dla wszystkich użytkowników w /posts/$postid i jednoczesnego pobierania klucza. Klucz może następnie zostać użyty do utworzenia drugiego wpisu w postach użytkownika pod adresem /user-posts/$userid/$postid .

Korzystając z tych ścieżek, możesz wykonywać jednoczesne aktualizacje w wielu lokalizacjach w drzewie JSON za pomocą jednego wywołania update() , na przykład w tym przykładzie tworzy nowy wpis w obu lokalizacjach. Jednoczesne aktualizacje wykonane w ten sposób są atomowe: albo wszystkie aktualizacje się powiodły, albo wszystkie się nie powiodły.

Dodaj oddzwonienie dotyczące zakończenia

Jeśli chcesz wiedzieć, kiedy Twoje dane zostały zatwierdzone, możesz dodać wywołanie zwrotne zakończenia. Zarówno set() i update() pobierają opcjonalne wywołanie zwrotne zakończenia, które jest wywoływane po zatwierdzeniu zapisu w bazie danych. Jeśli wywołanie nie powiodło się, wywołanie zwrotne jest przekazywane do obiektu błędu wskazującego przyczynę niepowodzenia.

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

Usunąć dane

Najprostszym sposobem usunięcia danych jest wywołanie metody remove() w odniesieniu do lokalizacji tych danych.

Możesz również usunąć, określając null jako wartość dla innej operacji zapisu, takiej jak set() lub update() . Możesz użyć tej techniki z update() aby usunąć wiele elementów podrzędnych w jednym wywołaniu interfejsu API.

Otrzymaj Promise

Aby wiedzieć, kiedy Twoje dane zostaną przekazane na serwer bazy danych czasu rzeczywistego Firebase, możesz skorzystać z Promise . Zarówno set() i update() mogą zwrócić Promise której możesz użyć, aby wiedzieć, kiedy zapis zostanie zatwierdzony w bazie danych.

Odłącz słuchaczy

Wywołania zwrotne są usuwane przez wywołanie metody off() w odwołaniu do bazy danych Firebase.

Możesz usunąć pojedynczy detektor, przekazując go jako parametr do off() . Wywołanie funkcji off() w lokalizacji bez argumentów powoduje usunięcie wszystkich detektorów w tej lokalizacji.

Wywołanie off() na odbiorniku nadrzędnym nie usuwa automatycznie detektorów zarejestrowanych w jego węzłach potomnych; Aby usunąć wywołanie zwrotne, należy również wywołać funkcję off() we wszystkich odbiornikach podrzędnych.

Zapisz dane jako transakcje

Podczas pracy z danymi, które mogą zostać uszkodzone przez równoczesne modyfikacje, takie jak liczniki przyrostowe, można użyć operacji transakcji . Możesz nadać tej operacji funkcję aktualizacji i opcjonalne wywołanie zwrotne zakończenia. Funkcja aktualizacji przyjmuje bieżący stan danych jako argument i zwraca nowy żądany stan, który chcesz zapisać. Jeśli inny klient zapisuje do lokalizacji, zanim nowa wartość zostanie pomyślnie zapisana, funkcja aktualizacji jest wywoływana ponownie z nową bieżącą wartością, a zapis jest ponawiany.

Na przykład w przykładowej aplikacji do obsługi blogów społecznościowych możesz zezwolić użytkownikom na oznaczanie postów gwiazdkami i usuwanie ich gwiazd oraz śledzenie liczby gwiazdek, które otrzymał post w następujący sposób:

function toggleStar(postRef, uid) {
  postRef.transaction((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;
  });
}

Korzystanie z transakcji zapobiega błędnemu liczeniu gwiazdek, jeśli wielu użytkowników oznaczyło ten sam post w tym samym czasie lub klient miał nieaktualne dane. Jeśli transakcja zostanie odrzucona, serwer zwraca bieżącą wartość klientowi, który ponownie uruchamia transakcję ze zaktualizowaną wartością. Powtarza się do momentu zaakceptowania transakcji lub przerwania transakcji.

Zapisuj dane offline

Jeśli klient utraci połączenie sieciowe, Twoja aplikacja będzie nadal działać poprawnie.

Każdy klient połączony z bazą danych Firebase utrzymuje własną wewnętrzną wersję wszystkich aktywnych danych. Zapisane dane są najpierw zapisywane w tej wersji lokalnej. Następnie klient Firebase synchronizuje te dane ze zdalnymi serwerami bazy danych i innymi klientami na zasadzie „najlepszych starań”.

W rezultacie wszystkie zapisy do bazy danych wywołują zdarzenia lokalne natychmiast, zanim jakiekolwiek dane zostaną zapisane na serwerze. Oznacza to, że Twoja aplikacja reaguje niezależnie od opóźnień w sieci lub łączności.

Po ponownym nawiązaniu łączności aplikacja otrzymuje odpowiedni zestaw zdarzeń, dzięki czemu klient synchronizuje się z bieżącym stanem serwera bez konieczności pisania kodu niestandardowego.

Następne kroki