Ten dokument zawiera podstawowe informacje o pobieraniu danych oraz ich porządkowaniu i filtrowaniu. danych Firebase.
Zanim zaczniesz
Upewnij się, że aplikacja została skonfigurowana i masz dostęp do bazy danych w sposób opisany w
Get Started
.
Pobieram dane
Dane Firebase są pobierane przez jednorazowe wywołanie GetValue()
lub
do elementu ValueListener
w pliku referencyjnym FirebaseDatabase
. Wartość
detektor jest wywoływany raz w przypadku początkowego stanu danych i ponownie w dowolnym momencie
zmian danych.
Pobieranie odniesienia do bazy danych
Aby zapisać dane w bazie danych, potrzebujesz instancji DatabaseReference
:
// Get the root reference location of the database. firebase::database::DatabaseReference dbref = database->GetReference();
Odczytaj dane raz
Za pomocą metody GetValue()
możesz odczytać statyczny zrzut
treści w danej ścieżce. Wynik zadania będzie zawierał zrzut
który zawiera wszystkie dane w tej lokalizacji, w tym dane podrzędne. Jeśli nie ma danych,
zwrócony zrzut to null
.
firebase::Future<firebase::database::DataSnapshot> result = dbRef.GetReference("Leaders").GetValue();
Otrzymaliśmy już wprawdzie wniosek, ale musimy poczekać na przed odczytaniem wartości. Gry zwykle uruchamiają się w pętli. są mniej oparte na wywołaniach zwrotnych niż inne aplikacje, zwykle do końca.
// In the game loop that polls for the result... if (result.status() != firebase::kFutureStatusPending) { if (result.status() != firebase::kFutureStatusComplete) { LogMessage("ERROR: GetValue() returned an invalid result."); // Handle the error... } else if (result.error() != firebase::database::kErrorNone) { LogMessage("ERROR: GetValue() returned error %d: %s", result.error(), result.error_message()); // Handle the error... } else { firebase::database::DataSnapshot snapshot = result.result(); // Do something with the snapshot... } }
Tutaj znajdziesz podstawowe informacje o sprawdzaniu błędów. Zobacz Więcej informacji o firebase::Future o sprawdzaniu błędów i sposobach ustalenia, kiedy wynik jest gotowy.
Nasłuchiwanie zdarzeń
Możesz dodać detektorów, aby subskrybować zmiany w danych:
ValueListener
klasa bazowa
Oddzwanianie | Typowe zastosowanie |
---|---|
OnValueChanged |
Odczyt i nasłuchiwanie zmian w całej zawartości ścieżki. |
OnChildListener
klasa bazowa
OnChildAdded
| Pobieranie list elementów lub słuchanie, czy dodano elementy do listy.
Sugerowane zastosowanie z tymi funkcjami: OnChildChanged i
OnChildRemoved , aby monitorować zmiany na listach. |
OnChildChanged |
Wykrywaj zmiany wprowadzone w elementach na liście. Używaj z
OnChildAdded i OnChildRemoved do monitorowania
zmian na listach. |
OnChildRemoved |
Nasłuchuj elementów usuwanych z listy. Używaj z
OnChildAdded i OnChildChanged do monitorowania
zmian na listach. |
OnChildMoved |
Wykrywaj zmiany kolejności elementów na liście uporządkowanej.
OnChildMoved wywołania zwrotnego zawsze występuje po
OnChildChanged wywołań zwrotnych ze względu na zamówienie produktu
(w zależności od bieżącej metody sortowania). |
Klasa ValueListener
Za pomocą wywołań zwrotnych OnValueChanged
można zasubskrybować zmiany w
treści na danej ścieżce. To wywołanie zwrotne jest wywoływane raz, gdy detektor
za każdym razem, gdy dane, w tym elementy podrzędne, zostaną zmienione.
wywołanie zwrotne jest przekazywane do zrzutu zawierającego wszystkie dane w danej lokalizacji, w tym
danych dziecka. Jeśli nie ma danych, zwrócony zrzut ma wartość null
.
Przykład poniżej przedstawia grę, która pobiera wyniki z tabeli wyników z bazy danych:
class LeadersValueListener : public firebase::database::ValueListener { public: void OnValueChanged( const firebase::database::DataSnapshot& snapshot) override { // Do something with the data in snapshot... } void OnCancelled(const firebase::database::Error& error_code, const char* error_message) override { LogMessage("ERROR: LeadersValueListener canceled: %d: %s", error_code, error_message); } }; // Elsewhere in the code... LeadersValueListener* listener = new LeadersValueListener(); firebase::Future<firebase::database::DataSnapshot> result = dbRef.GetReference("Leaders").AddValueListener(listener);
Wynik funkcji Future<DataSnapshot>
zawiera dane z określonej lokalizacji
zapisanych w bazie danych w momencie wystąpienia zdarzenia. Wywołuję value()
podczas zrzutu
zwraca Variant
reprezentujący dane.
W tym przykładzie metoda OnCancelled
również została zastąpiona, aby sprawdzić, czy odczyt
został anulowany. Odczyt można anulować na przykład, jeśli klient nie ma
uprawnienia do odczytu z lokalizacji bazy danych Firebase. database::Error
podać przyczynę tego błędu.
Klasa ChildListener
Zdarzenia podrzędne są wywoływane w reakcji na określone operacje
elementu podrzędnego węzła pochodzącego z operacji, takiej jak nowy element podrzędny dodany za pomocą funkcji
Metoda PushChild()
lub element podrzędny aktualizowany za pomocą interfejsu UpdateChildren()
. Każda z tych opcji może być przydatna do słuchania zmian
konkretnego węzła w bazie danych. Na przykład gra może używać tych metod
aby monitorować aktywność w komentarzach do sesji gry, jak pokazano poniżej:
class SessionCommentsChildListener : public firebase::database::ChildListener { public: void OnChildAdded(const firebase::database::DataSnapshot& snapshot, const char* previous_sibling) override { // Do something with the data in snapshot ... } void OnChildChanged(const firebase::database::DataSnapshot& snapshot, const char* previous_sibling) override { // Do something with the data in snapshot ... } void OnChildRemoved( const firebase::database::DataSnapshot& snapshot) override { // Do something with the data in snapshot ... } void OnChildMoved(const firebase::database::DataSnapshot& snapshot, const char* previous_sibling) override { // Do something with the data in snapshot ... } void OnCancelled(const firebase::database::Error& error_code, const char* error_message) override { LogMessage("ERROR: SessionCommentsChildListener canceled: %d: %s", error_code, error_message); } }; // elsewhere .... SessionCommentsChildListener* listener = new SessionCommentsChildListener(); firebase::Future<firebase::database::DataSnapshot> result = dbRef.GetReference("GameSessionComments").AddChildListener(listener);
Wywołanie zwrotne OnChildAdded
jest zwykle używane do pobrania listy
elementy w bazie danych Firebase. Wywołanie zwrotne OnChildAdded
jest wywoływane raz
dla każdego istniejącego dziecka, a następnie za każdym razem, gdy do grupy
w podanej ścieżce. Odbiornik jest przekazywany do zrzutu zawierającego parametr nowego wydawcy podrzędnego
i skalowalnych danych.
Wywołanie zwrotne OnChildChanged
jest wywoływane za każdym razem, gdy węzeł podrzędny jest modyfikowany.
Obejmuje to wszelkie modyfikacje elementów podrzędnych węzła podrzędnego. Jest
zwykle używane w połączeniu z OnChildAdded
i OnChildRemoved
w odpowiedzi na zmiany na liście elementów. Zrzut przekazany do
detektor zawiera zaktualizowane dane elementu podrzędnego.
Wywołanie zwrotne OnChildRemoved
jest wyzwalane po usunięciu natychmiastowego elementu podrzędnego.
Jest zwykle używany w połączeniu z parametrami OnChildAdded
i
OnChildChanged
wywołań zwrotnych. Zrzut przekazany do wywołania zwrotnego zawiera
dane usuniętego konta dziecka.
Wywołanie zwrotne OnChildMoved
jest wywoływane zawsze, gdy OnChildChanged
jest podnoszone przez aktualizację, która powoduje zmianę kolejności elementu podrzędnego. Jest
używane z danymi uporządkowanych według: OrderByChild
lub OrderByValue
.
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. |
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 zasubskrybować wynik Tabela wyników posortowana według wyniku.
firebase::database::Query query = dbRef.GetReference("Leaders").OrderByChild("score"); // To get the resulting DataSnapshot either use query.GetValue() and poll the // future, or use query.AddValueListener() and register to handle the // OnValueChanged callback.
Definiuje to pole firebase::Query
, które w połączeniu z
ValueListener synchronizuje klienta z tabelą wyników
w bazie danych, uporządkowanych według wyniku każdej pozycji.
Więcej informacji na temat efektywnego porządkowania danych znajdziesz w
Utwórz strukturę bazy danych.
Wywołanie metody OrderByChild()
określa klucz podrzędny, aby uporządkować
według. W tym przypadku wyniki są sortowane według wartości parametru "score"
wartości w każdym elemencie podrzędnym. 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. |
EndAt() |
Zwraca elementy mniejsze lub równe podanej wartości klucza bądź wartości w zależności od wybranej metody sortowania. |
EqualTo() |
Zwraca elementy równe określonemu kluczowi lub określonej wartości w zależności od wybranej 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.
Nawet jeśli dla zapytania znaleziono tylko jedno dopasowanie, zrzut nie zmienia się listę; zawiera tylko jeden element.
Ogranicz liczbę wyników
Możesz użyć metod LimitToFirst()
i LimitToLast()
, aby ustawić
maksymalna liczba dzieci do zsynchronizowania w przypadku danego wywołania zwrotnego. Na przykład, jeśli
używasz aplikacji LimitToFirst()
, aby ustawić limit wynoszący 100, początkowo otrzymasz tylko
do 100 wywołań zwrotnych OnChildAdded
. Jeśli na
bazy danych Firebase, dla każdego elementu uruchamia się wywołanie zwrotne OnChildAdded
.
W miarę zmiany elementów otrzymujesz OnChildAdded
wywołań zwrotnych dla elementów, które zostały wprowadzone
oraz wywołania zwrotne OnChildRemoved
dla elementów, które z niego opuszczają, tak aby
łączna liczba pozostaje na poziomie 100.
Na przykład poniższy kod zwraca najlepszy wynik z tabeli wyników:
firebase::database::Query query = dbRef.GetReference("Leaders").OrderByChild("score").LimitToLast(1); // To get the resulting DataSnapshot either use query.GetValue() and poll the // future, or use query.AddValueListener() and register to handle the // OnValueChanged callback.
Filtruj według klucza lub wartości
Możesz użyć dowolnych danych StartAt()
, EndAt()
i EqualTo()
początkowym, końcowym i równoważnym dla zapytań. Może to być przydatne dla:
dzielenie danych na strony lub znajdowanie elementów z dziećmi, 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 z 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.