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

Pracuj z listami danych w Internecie

Uzyskaj odniesienie do bazy danych

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

Web v8

var database = firebase.database();

Web v9

import { getDatabase } from "firebase/database";

const database = getDatabase();

Czytanie i pisanie list

Dołącz do listy danych

Użyj metody push() , aby dołączyć dane do listy w aplikacjach dla wielu użytkowników. Metoda push() generuje unikalny klucz za każdym razem, gdy do określonego odwołania Firebase zostanie dodane nowe dziecko. Używając tych automatycznie generowanych kluczy dla każdego nowego elementu na liście, kilku klientów może jednocześnie dodawać elementy podrzędne do tej samej lokalizacji bez konfliktów zapisu. Unikalny klucz generowany przez push() jest oparty na sygnaturze czasowej, więc elementy listy są automatycznie sortowane chronologicznie.

Możesz użyć odwołania do nowych danych zwróconych przez metodę push() , aby uzyskać wartość automatycznie wygenerowanego klucza dziecka lub ustawić dane dla dziecka. Właściwość .key odwołania push() zawiera automatycznie wygenerowany klucz.

Możesz użyć tych automatycznie generowanych kluczy, aby uprościć spłaszczenie struktury danych. Aby uzyskać więcej informacji, zobacz przykład rozpowszechniania danych.

Na przykład push() może posłużyć do dodania nowego posta do listy postów w aplikacji społecznościowej:

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

Nasłuchuj wydarzeń podrzędnych

Zdarzenia podrzędne są wyzwalane w odpowiedzi na określone operacje, które mają miejsce na elementach podrzędnych węzła w wyniku operacji, takiej jak nowe dziecko dodane za push() metody push() lub element podrzędny aktualizowany za pomocą metody update() .

Zdarzenie Typowe użycie
child_added Pobieraj listy pozycji lub słuchaj, czy nie ma dodatków do listy pozycji. To zdarzenie jest wyzwalane raz dla każdego istniejącego elementu podrzędnego, a następnie ponownie za każdym razem, gdy nowe dziecko jest dodawane do określonej ścieżki. Odbiornik otrzymuje migawkę zawierającą dane nowego dziecka.
child_changed Nasłuchuj zmian w elementach na liście. To zdarzenie jest wyzwalane za każdym razem, gdy modyfikowany jest węzeł podrzędny. Obejmuje to wszelkie modyfikacje potomków węzła podrzędnego. Migawka przekazana do nasłuchiwania zdarzeń zawiera zaktualizowane dane dziecka.
child_removed Nasłuchuj elementów usuwanych z listy. To zdarzenie jest wyzwalane po usunięciu bezpośredniego elementu podrzędnego. Migawka przekazana do bloku wywołania zwrotnego zawiera dane dla usuniętego elementu podrzędnego.
child_moved Nasłuchuj zmian w kolejności elementów na uporządkowanej liście. Zdarzenia child_moved zawsze następują po zdarzeniu child_changed , które spowodowało zmianę kolejności elementu (na podstawie bieżącej metody child_changed według).

Każde z nich razem może być przydatne do nasłuchiwania zmian w określonym węźle w bazie danych. Na przykład aplikacja do obsługi blogów społecznościowych może używać tych metod razem do monitorowania aktywności w komentarzach do posta, jak pokazano poniżej:

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

Nasłuchuj wydarzeń wartościowych

Podczas gdy nasłuchiwanie zdarzeń podrzędnych jest zalecanym sposobem czytania list danych, istnieją sytuacje, w których nasłuchiwanie zdarzeń wartości w odwołaniu do listy jest przydatne.

Dołączenie obserwatora value do listy danych zwróci całą listę danych jako pojedynczą migawkę, którą można następnie zapętlić, aby uzyskać dostęp do poszczególnych elementów podrzędnych.

Nawet jeśli istnieje tylko jedno dopasowanie do zapytania, migawka nadal jest listą; zawiera tylko jeden element. Aby uzyskać dostęp do elementu, musisz zapętlić wynik:

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

Ten wzorzec może być przydatny, gdy chcesz pobrać wszystkie elementy podrzędne listy w jednej operacji, zamiast nasłuchiwać dodatkowych zdarzeń podrzędnych.

Sortowanie i filtrowanie danych

Możesz użyć klasy Realtime Database Query aby pobrać dane posortowane według klucza, wartości lub wartości elementu podrzędnego. Możesz również przefiltrować posortowany wynik do określonej liczby wyników lub zakresu kluczy lub wartości.

Sortuj dane

Aby pobrać posortowane dane, zacznij od określenia jednej z metod sortowania, aby określić, w jaki sposób są uporządkowane wyniki:

metoda Stosowanie
orderByChild() Uporządkuj wyniki według wartości określonego klucza podrzędnego lub zagnieżdżonej ścieżki podrzędnej.
orderByKey() Sortuj wyniki według kluczy podrzędnych.
orderByValue() Uporządkuj wyniki według wartości podrzędnych.

W danym momencie możesz użyć tylko jednej metody sortowania według. Wielokrotne wywoływanie metody Order-by w tym samym zapytaniu powoduje błąd.

Poniższy przykład pokazuje, jak można pobrać listę najpopularniejszych postów użytkownika posortowanych według liczby gwiazdek:

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

Definiuje zapytanie, które w połączeniu z odbiornikiem potomnym synchronizuje klienta z postami użytkownika ze ścieżki w bazie danych na podstawie jego identyfikatora użytkownika, uporządkowanego według liczby gwiazdek, które otrzymał każdy post. Ta technika używania identyfikatorów jako kluczy indeksu jest nazywana rozszerzaniem danych . Możesz przeczytać więcej na ten temat w Struktury Twojej bazy danych .

Wywołanie metody orderByChild() określa klucz podrzędny, według którego wyniki zostaną uporządkowane. W tym przypadku posty są sortowane według wartości ich odpowiedniego "starCount" podrzędnego "starCount" . Zapytania można również porządkować według zagnieżdżonych elementów podrzędnych, jeśli masz dane, które wyglądają następująco:

"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",
  }
},

W takim przypadku możemy uporządkować elementy listy według wartości zagnieżdżonych w kluczu metrics , określając względną ścieżkę do zagnieżdżonego elementu potomnego w naszym orderByChild() .

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

Aby uzyskać więcej informacji na temat kolejności innych typów danych, zobacz Jak uporządkowane są dane zapytania .

Filtrowanie danych

Aby filtrować dane, podczas konstruowania zapytania można połączyć dowolne metody limitu lub zakresu z metodą sortowania według.

metoda Stosowanie
limitToFirst() Ustawia maksymalną liczbę elementów do zwrócenia od początku uporządkowanej listy wyników.
limitToLast() Ustawia maksymalną liczbę elementów do zwrócenia z końca uporządkowanej listy wyników.
startAt() Zwróć elementy większe lub równe podanemu kluczowi lub wartości, w zależności od wybranej metody sortowania według.
startAfter() Zwróć elementy większe niż określony klucz lub wartość w zależności od wybranej metody sortowania według.
endAt() Zwróć elementy mniejsze lub równe podanemu kluczowi lub wartości, w zależności od wybranej metody sortowania według.
endBefore() Zwróć elementy mniejsze niż określony klucz lub wartość w zależności od wybranej metody sortowania według.
equalTo() Zwróć elementy równe określonemu kluczowi lub wartości, w zależności od wybranej metody sortowania.

W przeciwieństwie do metod sortowania według, można łączyć wiele funkcji limitów lub zakresów. Na przykład można połączyć metody startAt() i endAt() , aby ograniczyć wyniki do określonego zakresu wartości.

Ogranicz liczbę wyników

Możesz użyć limitToFirst() i limitToLast() , aby ustawić maksymalną liczbę elementów limitToLast() mają być synchronizowane dla danego zdarzenia. Na przykład, jeśli użyjesz limitToFirst() do ustawienia limitu 100, początkowo otrzymasz tylko do 100 zdarzeń child_added . Jeśli masz mniej niż 100 elementów przechowywanych w bazie danych child_added , dla każdego elementu jest child_added zdarzenie child_added .

Gdy elementy się zmieniają, otrzymujesz zdarzenia child_added dla elementów, które wprowadzają zapytanie, oraz zdarzenia child_removed dla elementów, które z niego wypadają, dzięki czemu łączna liczba pozostaje na poziomie 100.

Poniższy przykład ilustruje, jak przykładowa aplikacja do blogowania definiuje zapytanie w celu pobrania listy 100 najnowszych postów wszystkich użytkowników:

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

Ten przykład definiuje tylko zapytanie, aby faktycznie zsynchronizować dane, musi mieć dołączony detektor .

Filtruj według klucza lub wartości

Możesz użyć startAt() , startAfter() , endAt() , endBefore() i equalTo() aby wybrać dowolne punkty początkowe, końcowe i równoważne dla zapytań. Może to być przydatne do podziału na strony danych lub wyszukiwania elementów z elementami podrzędnymi, które mają określoną wartość.

Jak uporządkowane są dane zapytania

W tej sekcji wyjaśniono, w jaki sposób dane są sortowane według każdej metody porządkowania według klasy Query .

orderByChild

W przypadku korzystania z funkcji orderByChild() dane, które zawierają określony klucz podrzędny, są uporządkowane w następujący sposób:

  1. Na pierwszym miejscu są elementy podrzędne z wartością null dla określonego klucza podrzędnego.
  2. Następne są elementy podrzędne z wartością false dla określonego klucza podrzędnego. Jeśli wiele dzieci ma wartość false , są one sortowane leksykograficznie według klucza.
  3. Następne są elementy podrzędne z wartością true dla określonego klucza podrzędnego. Jeśli wiele dzieci ma wartość true , są one sortowane leksykograficznie według klucza.
  4. Następnie znajdują się dzieci z wartością liczbową, posortowane w kolejności rosnącej. Jeśli wiele elementów podrzędnych ma tę samą wartość liczbową dla określonego węzła podrzędnego, są one sortowane według klucza.
  5. Ciągi znaków występują po liczbach i są sortowane leksykograficznie w porządku rosnącym. Jeśli wiele elementów podrzędnych ma tę samą wartość dla określonego węzła podrzędnego, są one uporządkowane leksykograficznie według klucza.
  6. Obiekty są na końcu i są sortowane leksykograficznie według kluczy w porządku rosnącym.

orderByKey

Kiedy używasz orderByKey() do sortowania danych, dane są zwracane w kolejności rosnącej według klucza.

  1. Elementy potomne z kluczem, który można przeanalizować jako 32-bitową liczbę całkowitą, znajdują się na pierwszym miejscu, posortowane w kolejności rosnącej.
  2. Jako następne znajdują się elementy podrzędne z wartością ciągu jako kluczem, posortowane leksykograficznie w porządku rosnącym.

orderByValue

W przypadku korzystania z funkcji orderByValue() są sortowane według ich wartości. Kryteria porządkowania są takie same jak w orderByChild() , z wyjątkiem tego, że wartość węzła jest używana zamiast wartości określonego klucza podrzędnego.

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 funkcji 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 potomnych.

Następne kroki