Pobieranie odniesienia do bazy danych
Aby móc odczytywać lub zapisywać dane z bazy danych, musisz mieć instancję
firebase.database.Reference
:
Web
import { getDatabase } from "firebase/database"; const database = getDatabase();
Web
var database = firebase.database();
Czytam i zapisuję listy
Dołącz do listy danych
Użyj metody push()
, aby dołączać dane do listy w aplikacjach, które mają wielu użytkowników.
Metoda push()
generuje unikalny klucz za każdym razem, gdy do grupy jest dodawane nowe dziecko
określone odwołanie do Firebase. Używając tych automatycznie wygenerowanych kluczy przy każdym
nowego elementu na liście, kilka klientów może dodawać elementy podrzędne do tej samej lokalizacji.
jednocześnie, bez konfliktów zapisu. Unikalny klucz wygenerowany przez usługę push()
według sygnatury czasowej, więc elementy listy są automatycznie porządkowane
chronologicznie.
Możesz użyć odwołania do nowych danych zwróconych przez metodę push()
, aby uzyskać
wartość automatycznie wygenerowanego klucza lub zbioru danych wydawcy podrzędnego.
Właściwość .key
odniesienia push()
zawiera automatycznie wygenerowany klucz.
Możesz użyć tych automatycznie wygenerowanych kluczy, aby uprościć udostępnianie danych do jego struktury. Więcej informacji znajdziesz w opisie rozpowszechniania danych przykład.
Na przykład push()
może posłużyć do dodania nowego posta do listy postów
w aplikacji społecznościowej:
Web
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, { // ... });
Web
// Create a new post reference with an auto-generated id var postListRef = firebase.database().ref('posts'); var newPostRef = postListRef.push(); newPostRef.set({ // ... });
Nasłuchuj zdarzeń podrzędnych
Zdarzenia podrzędne są wywoływane w odpowiedzi na określone operacje, które zachodzą
elementów podrzędnych węzła z operacji, np. nowego elementu podrzędnego dodanego za pomocą
push()
lub element podrzędny aktualizowany za pomocą metody update()
.
Zdarzenie | Typowe zastosowanie |
---|---|
child_added |
Pobieranie list elementów lub słuchanie, czy dodano elementy do listy. To zdarzenie jest wywoływane raz dla każdego istniejącego elementu podrzędnego, a potem ponownie za każdym razem, gdy do określonej ścieżki jest dodawany nowy element podrzędny. Słuchacz przesłał zrzut dysku zawierający dane nowego wydawcy podrzędnego. |
child_changed |
Wykrywaj zmiany wprowadzone w elementach na liście. To zdarzenie jest wywoływane za każdym razem, gdy zmodyfikowany jest węzeł podrzędny. Obejmuje to m.in. jakichkolwiek modyfikacji elementów potomnych węzła podrzędnego. Zrzut został zaliczony do detektora zdarzeń zawiera zaktualizowane dane dotyczące elementu podrzędnego. |
child_removed |
Nasłuchuj elementów usuwanych z listy. To zdarzenie jest wyzwalane, gdy: zostanie usunięte natychmiastowe element podrzędny.Zrzut przekazywany do bloku wywołania zwrotnego zawiera dane usuniętego elementu podrzędnego. |
child_moved |
Wykrywaj zmiany kolejności elementów na liście uporządkowanej.
Zdarzenia typu child_moved zawsze występują po
child_changed zdarzenie, które spowodowało zamówienie tego produktu na
(w zależności od bieżącej metody sortowania).
|
Każda z tych opcji może być przydatna do monitorowania zmian w konkretnych w bazie danych. Na przykład aplikacja do obsługi blogów społecznościowych może wykorzystywać te metody aby monitorować aktywność w komentarzach do posta, na przykład:
Web
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); });
Web
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); });
Wykrywaj zdarzenia dotyczące wartości
Podczas nasłuchiwania zdarzeń podrzędnych to zalecany sposób odczytywania list danych, są sytuacje, w których nasłuchiwanie zdarzeń wartości w odniesieniu do listy jest przydatne.
Dołączenie obserwatora value
do listy danych spowoduje zwrócenie
pełną listę danych w postaci pojedynczego zrzutu, do którego
dostępu do poszczególnych dzieci.
Nawet jeśli dla zapytania znaleziono tylko jedno dopasowanie, zrzut nadal jest lista; zawiera tylko jeden element. Aby uzyskać dostęp do elementu, musisz utworzyć pętlę w stosunku do wyniku:
Web
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 });
Web
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 ramach jednej operacji, zamiast nasłuchiwać dodanych wydawców podrzędnych. zdarzeń.
Sortowanie i filtrowanie danych
Możesz użyć klasy Realtime Database Query
, aby pobrać dane posortowane według
według klucza, wartości lub wartości elementu podrzędnego. Możesz też filtrować
posortowany wynik do określonej liczby wyników lub zakresu kluczy albo
.
Sortowanie danych
Aby pobrać posortowane dane, zacznij od określenia jednej z metod Określanie kolejności wyników:
Metoda | Wykorzystanie |
---|---|
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. |
W danym momencie możesz używać tylko jednej metody sortowania. Wywoływanie kolejności według metody które kilka razy wywoła to samo zapytanie, spowoduje zgłoszenie błędu.
Poniższy przykład pokazuje, jak można pobrać listę danych użytkownika najpopularniejsze posty posortowane według liczby gwiazdek:
Web
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'));
Web
var myUserId = firebase.auth().currentUser.uid; var topUserPostsRef = firebase.database().ref('user-posts/' + myUserId).orderByChild('starCount');
Definiuje zapytanie, które w połączeniu z detektorem podrzędnym synchronizuje klienta z postami użytkownika ze ścieżki w bazie danych. według identyfikatora użytkownika, uporządkowanych według liczby gwiazdek przyznanych poszczególnym postom. Ta technika wykorzystywania identyfikatorów jako kluczy indeksu nosi nazwę rozpowszechniania danych. Możesz odczytać więcej na ten temat znajdziesz w Utwórz strukturę bazy danych.
Wywołanie metody orderByChild()
określa klucz podrzędny, aby uporządkować
według. W tym przypadku posty są sortowane według wartości
"starCount"
dla danego elementu podrzędnego. Zapytania mogą być też porządkowane według zagnieżdżonych
dzieci, w przypadku gdy masz dane podobne do tych:
"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 uporządkować elementy listy według wartości zagnieżdżonych w
metrics
, określając ścieżkę względną do zagnieżdżonego elementu podrzędnego w naszym
orderByChild()
połączenie.
Web
import { getDatabase, ref, query, orderByChild } from "firebase/database"; const db = getDatabase(); const mostViewedPosts = query(ref(db, 'posts'), orderByChild('metrics/views'));
Web
var mostViewedPosts = firebase.database().ref('posts').orderByChild('metrics/views');
Aby dowiedzieć się więcej o kolejności innych typów danych, przeczytaj artykuł o porządkowaniu danych w zapytaniach.
Filtrowanie danych
Aby filtrować dane, możesz połączyć dowolne metody limitów lub zakresów za pomocą funkcji kolejność według metody podczas tworzenia zapytania.
Metoda | Wykorzystanie |
---|---|
limitToFirst() |
Określa maksymalną liczbę elementów do zwrócenia od początku wartości uporządkowana lista wyników. |
limitToLast() |
Określa maksymalną liczbę produktów do zwrócenia od końca zamówionego produktu z listą wyników. |
startAt() |
Zwraca elementy większe lub równe określonemu kluczowi lub wartościowi, w zależności od wybranej metody sortowania. |
startAfter() |
Zwraca elementy większe niż określony klucz lub wartość w zależności od wybranej metody sortowania. |
endAt() |
Zwraca elementy mniejsze lub równe określonemu kluczowi lub wartościowi, w zależności od wybranej metody sortowania. |
endBefore() |
Zwraca elementy mniejsze niż określony klucz lub wartość w zależności od wybranej metody sortowania. |
equalTo() |
Zwraca elementy równe określonemu kluczowi lub wartości, w zależności od tego, według metody sortowania. |
W przeciwieństwie do metod sortowania według kolejności można łączyć wiele funkcji ograniczeń lub zakresu.
Możesz na przykład połączyć metody startAt()
i endAt()
, aby ograniczyć
wyniki do określonego zakresu wartości.
Ogranicz liczbę wyników
Możesz użyć metod limitToFirst()
i limitToLast()
, aby ustawić
maksymalna liczba dzieci, które mają być synchronizowane w przypadku danego wydarzenia. Na przykład, jeśli
używasz aplikacji limitToFirst()
, aby ustawić limit wynoszący 100, początkowo otrzymasz tylko
do 100 zdarzeń child_added
. Jeśli na
bazy danych Firebase, dla każdego elementu uruchamia się zdarzenie child_added
.
W miarę zmian będziesz otrzymywać zdarzenia typu child_added
dla elementów, które wprowadziły do
oraz child_removed
dla elementów, które z niego opuszczają, tak aby
łączna liczba pozostaje na poziomie 100.
Poniższy przykład pokazuje, jak przykładowa aplikacja do blogowania definiuje zapytanie w celu pobierz listę 100 najnowszych postów wszystkich użytkowników:
Web
import { getDatabase, ref, query, limitToLast } from "firebase/database"; const db = getDatabase(); const recentPostsRef = query(ref(db, 'posts'), limitToLast(100));
Web
var recentPostsRef = firebase.database().ref('posts').limitToLast(100);
Ten przykład definiuje tylko zapytanie służące do faktycznego synchronizowania danych, których potrzebuje ma dołączonego detektora.
Filtruj według klucza lub wartości
Możesz używać tych usług: startAt()
, startAfter()
, endAt()
, endBefore()
i
equalTo()
, aby wybrać dowolny punkt początkowy, końcowy i równoważny dla
zapytań. Może to być przydatne przy dzieleniu danych na strony lub znajdowaniu elementów mających dzieci
które mają określoną wartość.
Sposób porządkowania danych zapytań
W tej sekcji omówiono sposób sortowania danych według poszczególnych metod
Query
zajęcia.
orderByChild
Gdy używasz orderByChild()
, dane zawierające określony klucz podrzędny są
w następującej kolejności:
- Elementy podrzędne z wartością
null
określonego klucza podrzędnego są dostarczane . - Elementy podrzędne o wartości
false
określonego klucza podrzędnego co dalej. Jeśli kilka elementów podrzędnych ma wartośćfalse
, są one posortowane leksykograficznie według klucza. - Elementy podrzędne o wartości
true
określonego klucza podrzędnego co dalej. Jeśli kilka elementów podrzędnych ma wartośćtrue
, są one posortowane leksykograficznie według klucza. - Następne są elementy podrzędne z wartością liczbową, posortowane w kolejności rosnącej. Jeśli kilka elementów podrzędnych ma tę samą wartość liczbową określonego elementu podrzędnego węzłów, są one sortowane według klucza.
- Ciągi znaków znajdują się po liczbach i są sortowane leksykograficznie w kolejności rosnącej zamówienie. Jeśli kilka elementów podrzędnych ma tę samą wartość określonego elementu podrzędnego są uporządkowane leksykograficznie według klucza.
- Obiekty są na końcu i są sortowane leksykograficznie według klucza w kolejności rosnącej.
orderByKey
Gdy dane są sortowane przy użyciu funkcji orderByKey()
, są one zwracane w kolejności rosnącej
klawiszem.
- Elementy podrzędne z kluczem, który można przeanalizować jako 32-bitową liczbę całkowitą, są na pierwszym miejscu, posortowane w kolejności rosnącej.
- Następnym elementem są elementy podrzędne z wartością w postaci ciągu znaków, posortowane leksykograficznie w kolejności rosnącej.
orderByValue
Gdy używasz metody orderByValue()
, elementy podrzędne są uporządkowane według wartości. Kolejność
kryteria są takie same jak w orderByChild()
, z wyjątkiem wartości węzła
zamiast wartości określonego klucza podrzędnego.
Odłącz detektory
Wywołania zwrotne są usuwane przez wywołanie metody off()
na Twoim
Dokumentacja bazy danych Firebase.
Możesz usunąć pojedynczy detektor, przekazując go jako parametr do off()
.
Wywołanie off()
w lokalizacji bez argumentów powoduje usunięcie wszystkich detektorów w tym
lokalizacji.
Wywoływanie połączenia off()
w przypadku detektora nadrzędnego
automatycznie usuwać detektory zarejestrowane w węzłach podrzędnych;
Funkcja off()
musi być również wywoływana w przypadku podrzędnych detektorów
, aby usunąć wywołanie zwrotne.