Praca z listami danych w sieci

Uzyskaj odniesienie do bazy danych

Do odczytu lub zapisu danych z bazy danych, trzeba instancję firebase.database.Reference :

Wersja internetowa 9

import { getDatabase } from "firebase/database";

const database = getDatabase();

Wersja internetowa 8

var database = firebase.database();

Czytanie i pisanie list

Dołącz do listy danych

Użyj push() metody, aby dołączyć dane do listy w aplikacji dla wielu użytkowników. push() metoda generuje unikalny klucz za każdym razem nowe dziecko jest dodawany do określonego odniesienia Firebase. Korzystając z 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. Unikatowy klucz generowany przez push() jest oparty na datownik, więc elementy listy są automatycznie uporządkowane chronologicznie.

Można użyć odniesienie do nowych danych zwracanych przez push() metoda, aby uzyskać wartość generowanych automatycznie kluczowych lub zestaw danych dziecka do dziecka. .key właściwością push() odniesienie zawiera klucz automatycznie wygenerowane.

Możesz użyć tych automatycznie wygenerowanych kluczy, aby uprościć spłaszczanie struktury danych. Aby uzyskać więcej informacji, zobacz fan-out danych przykład .

Na przykład push() mogą być wykorzystane, aby dodać nowy wpis do listy wiadomości w aplikacji społecznego:

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

Wersja internetowa 8

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

Słuchaj wydarzeń dla dzieci

Imprezy dla dzieci są wywoływane w odpowiedzi na konkretne działania, które zdarzają się dzieciom węzła z operacji, takich jak nowe dziecko dodanego przez push() metody lub dziecka aktualizowany przez update() metody.

Wydarzenie Typowe zastosowanie
child_added Pobierz listy elementów lub nasłuchuj dodatków do listy elementów. To zdarzenie jest wywoływane raz dla każdego istniejącego dziecka, 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 Posłuchaj zmian w elementach na liście. To zdarzenie jest wywoływane 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 detektora zdarzeń zawiera zaktualizowane dane dziecka.
child_removed Nasłuchuj, czy elementy są usuwane z listy. To zdarzenie jest wywoływane po usunięciu bezpośredniego elementu podrzędnego. Migawka przekazana do bloku wywołania zwrotnego zawiera dane usuniętego elementu podrzędnego.
child_moved Nasłuchuj zmian w kolejności elementów na uporządkowanej liście. child_moved wydarzenia zawsze przestrzegać child_changed zdarzenia, powodującego rozkazywać rzecz do zmiany (na podstawie bieżącej zleceniami metodą).

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

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

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

Posłuchaj wydarzeń o wartości

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

Dołączanie value obserwatora do listy danych zwróci całą listę danych jako pojedynczy migawce których można następnie pętli nad dostępu do poszczególnych dzieci.

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

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

Wersja internetowa 8

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

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żna użyć Realtime Database Query klasy odzyskać dane posortowane według klucza, według wartości, lub według wartości dziecka. Posortowany wynik można również filtrować według określonej liczby wyników lub zakresu kluczy lub wartości.

Sortuj dane

Aby pobrać posortowane dane, zacznij od określenia jednej z metod uporządkowania według, aby określić sposób uporządkowania wyników:

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

Można użyć tylko jednego zleceniami metodą naraz. Wielokrotne wywoływanie metody order-by w tym samym zapytaniu powoduje błąd.

Poniższy przykład ilustruje, w jaki sposób można pobrać listę najlepszych postów użytkownika posortowanych według liczby gwiazdek:

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

Wersja internetowa 8

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

To określa zapytanie, które w połączeniu ze słuchaczem dziecka synchronizuje klientowi postów użytkownika ze ścieżki w bazie danych na podstawie ich identyfikatora użytkownika, uporządkowane według liczby gwiazd każdy post odebranych. Ta technika z użyciem identyfikatorów kluczy indeksowych jak nazywa wentylatora danych out, można przeczytać więcej na ten temat w strukturze bazy danych .

Wezwanie do orderByChild() metody określa klucz dziecko na zamówienie wyników przez. W tym przypadku, słupki są klasyfikowane według wartości ich odpowiednich "starCount" dziecka. Zapytania mogą być również porządkowane według zagnieżdżonych elementów potomnych, jeśli masz dane, które wyglądają tak:

"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 tym przypadku, możemy zamówić naszą listę elementów wartościami zagnieżdżone pod metrics klucza określając ścieżkę względną do zagnieżdżonego dziecka w naszym orderByChild() rozmowy.

Wersja internetowa 9

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

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

Wersja internetowa 8

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

Aby uzyskać więcej informacji o tym, jak inne typy danych są sortowane, zobacz Jak kwerendy danych jest uporządkowane .

Filtrowanie danych

Aby filtrować dane, podczas konstruowania zapytania można połączyć dowolną metodę limitu lub zakresu z metodą kolejności 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 od końca uporządkowanej listy wyników.
startAt() Zwróć elementy większe lub równe określonemu kluczowi lub wartości, w zależności od wybranej metody sortowania według.
startAfter() Zwróć przedmioty 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 określonemu kluczowi lub wartości, w zależności od wybranej metody sortowania według.
endBefore() Zwróć przedmioty 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 według.

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

Ogranicz liczbę wyników

Można użyć limitToFirst() i limitToLast() metody, aby ustawić maksymalną liczbę dzieci, które mają być synchronizowane dla danego zdarzenia. Na przykład, jeśli używasz limitToFirst() , aby ustawić limit 100, początkowo tylko otrzymać do 100 child_added wydarzeń. Jeśli masz mniej niż 100 przedmiotów przechowywanych w bazie danych, a Firebase child_added pożarów zdarzenie dla każdego elementu.

Jak zmienić pozycji, pojawi child_added zdarzeń dla elementów, które wchodzą zapytanie i child_removed imprezy dla przedmiotów, które wypadają z niego tak, że całkowita liczba pobytów na 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:

Wersja internetowa 9

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

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

Wersja internetowa 8

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

Przykład ten określa jedynie zapytanie, aby zsynchronizować dane rzeczywiście musi mieć dołączony słuchacza .

Filtruj według klucza lub wartości

Można użyć startAt() , startAfter() , endAt() , endBefore() , a equalTo() , aby wybrać dowolnego wyjścia, kończy, a punkty równorzędności zapytaniami. Może to być przydatne w przypadku stronicowania danych lub znajdowania elementów z dziećmi, które mają określoną wartość.

Jak uporządkowane są dane zapytania

Ta sekcja wyjaśnia, w jaki sposób dane są klasyfikowane według każdego z metodami zleceniami w Query klasy.

orderByChild

Podczas korzystania orderByChild() , dane, które zawiera określony klucz dziecko zarządza się, co następuje:

  1. Dzieci z null wartością dla określonego klucza dziecka na pierwszym miejscu.
  2. Dzieci z wartością false dla określonego klucza dziecko przyjdzie następny. Jeśli wiele dzieci ma wartość false , są one klasyfikowane leksykograficznie przez klucz.
  3. Dzieci o wartości true dla określonego klucza dziecko przyjdzie następny. Jeśli wiele dzieci ma wartość true , są one klasyfikowane leksykograficznie przez klucz.
  4. Następne są dzieci z wartością numeryczną, posortowane w porządku rosnącym. 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 pojawiają się po liczbach i są posortowane 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 znajdują się na końcu i są sortowane leksykograficznie według klucza w porządku rosnącym.

orderByKey

Podczas korzystania orderByKey() do sortowania danych, dane są zwracane w kolejności rosnącej według klucza.

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

orderByValue

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

Odłącz słuchaczy

Oddzwaniania są usuwane poprzez wywołanie off() metody na swojej Firebase odniesienia bazy danych.

Można usunąć pojedynczy słuchacza przez przepuszczenie go jako parametr do off() . Wywołanie off() na miejscu bez żadnych argumentów usuwa wszystkie słuchaczy w tym miejscu.

Wywołanie off() na słuchacza dominującej nie powoduje automatycznego usunięcia detektory zarejestrowane na jego węzłów potomnych; off() musi być również nazywane na wszelkich detektorów podrzędnych do usunięcia zwrotnego.

Następne kroki