W tym dokumencie znajdziesz podstawowe informacje o pobieraniu danych oraz o sortowaniu i filtrowaniu danych Firebase.
Zanim zaczniesz
Upewnij się, że aplikacja jest skonfigurowana i masz dostęp do bazy danych zgodnie z instrukcjami w przewodniku Get Started
.
Pobieranie danych
Dane Firebase są pobierane przez jednorazowe wywołanie funkcji GetValue()
lub przez dołączenie do funkcji ValueListener
w odniesieniu do funkcji FirebaseDatabase
. Funkcja nasłuchująca wartości jest wywoływana raz w przypadku stanu początkowego danych i ponownie za każdym razem, gdy dane się zmienią.
Pobieranie DatabaseReference
Aby zapisywać dane w bazie danych, potrzebujesz instancji DatabaseReference
:
// Get the root reference location of the database. firebase::database::DatabaseReference dbref = database->GetReference();
Odczytywanie danych tylko raz
Możesz użyć metody GetValue()
, aby jednorazowo odczytać statyczny zrzut zawartości w danej ścieżce. Wynik zadania będzie zawierać migawkę zawierającą wszystkie dane w tej lokalizacji, w tym dane podrzędne. Jeśli nie ma danych, zwrócony snapshot to null
.
firebase::Future<firebase::database::DataSnapshot> result = dbRef.GetReference("Leaders").GetValue();
W tym momencie żądanie zostało wysłane, ale musimy poczekać, aż obiekt Future zostanie ukończony, aby można było odczytać wartość. Gry zwykle działają w pętli i są mniej oparte na wywołaniach zwrotnych niż inne aplikacje, dlatego zwykle sprawdzasz, czy zostały ukończone.
// 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... } }
Pokazuje to podstawowe sprawdzanie błędów. Więcej informacji o sprawdzaniu błędów i sposobach określania, kiedy wynik jest gotowy, znajdziesz w dokumentacji firebase::Future.
Nasłuchiwanie zdarzeń
Możesz dodać odbiorców, aby subskrybować zmiany danych:
ValueListener
klasa bazowa
Oddzwanianie | Typowe zastosowanie |
---|---|
OnValueChanged |
Odczytywanie i odsłuchiwanie zmian w całej zawartości ścieżki. |
OnChildListener
klasa bazowa
OnChildAdded
| pobierać listy elementów lub nasłuchiwać dodawania elementów do listy;
Sugerowane użycie z OnChildChanged i OnChildRemoved do monitorowania zmian na listach. |
OnChildChanged |
Monitorowanie zmian w elementach na liście. Używaj z OnChildAdded i OnChildRemoved , aby monitorować zmiany na listach. |
OnChildRemoved |
Nasłuchiwanie elementów usuwanych z listy. Używaj z elementami OnChildAdded i OnChildChanged , aby monitorować zmiany na listach. |
OnChildMoved |
Nasłuchiwanie zmian kolejności elementów na liście numerowanej.
OnChildMoved wywołania zwrotne zawsze następują po OnChildChanged wywołaniach zwrotnych z powodu zmiany kolejności elementów (na podstawie bieżącej metody sortowania). |
Klasa ValueListener
Możesz używać OnValueChanged
wywołań zwrotnych, aby subskrybować zmiany treści w danej ścieżce. To wywołanie zwrotne jest wywoływane raz po dołączeniu odbiornika i ponownie za każdym razem, gdy zmienią się dane, w tym dane dzieci. Funkcja zwrotna otrzymuje zrzut zawierający wszystkie dane w tej lokalizacji, w tym dane podrzędne. Jeśli nie ma danych, zwrócony zrzut to null
.
Poniższy przykład pokazuje, jak gra 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 Future<DataSnapshot>
zawiera dane z określonej lokalizacji w bazie danych w momencie wystąpienia zdarzenia. Wywołanie value()
na migawce
zwraca Variant
reprezentujący dane.
W tym przykładzie metoda OnCancelled
jest też zastępowana, aby sprawdzić, czy odczyt został anulowany. Odczyt może na przykład zostać anulowany, jeśli klient nie ma uprawnień do odczytu z lokalizacji bazy danych Firebase. Symbol database::Error
wskaże przyczynę niepowodzenia.
Klasa ChildListener
Zdarzenia dotyczące dzieci są wywoływane w odpowiedzi na określone operacje wykonywane na dzieciach węzła, np. dodanie nowego dziecka za pomocą metody PushChild()
lub zaktualizowanie dziecka za pomocą metody UpdateChildren()
. Każda z tych funkcji może być przydatna do śledzenia zmian w określonym węźle w bazie danych. Na przykład gra może używać tych metod razem, 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 pobierania listy elementów w bazie danych Firebase. Funkcja zwrotna OnChildAdded
jest wywoływana raz dla każdego istniejącego elementu podrzędnego, a potem za każdym razem, gdy do określonej ścieżki zostanie dodany nowy element podrzędny. Słuchacz otrzymuje migawkę zawierającą dane nowego elementu podrzędnego.
Wywołanie zwrotne OnChildChanged
jest wywoływane za każdym razem, gdy węzeł podrzędny zostanie zmodyfikowany.
Obejmuje to wszelkie modyfikacje elementów podrzędnych węzła podrzędnego. Jest on zwykle używany w połączeniu z wywołaniami OnChildAdded
i OnChildRemoved
w celu reagowania na zmiany na liście elementów. Zrzut przekazany do odbiorcy zawiera zaktualizowane dane dotyczące elementu podrzędnego.
Wywołanie zwrotne OnChildRemoved
jest wywoływane, gdy zostanie usunięte bezpośrednie dziecko.
Zwykle jest używana w połączeniu z wywołaniami zwrotnymi OnChildAdded
i OnChildChanged
. Zrzut przekazywany do wywołania zwrotnego zawiera dane usuniętego elementu podrzędnego.
Wywołanie zwrotne OnChildMoved
jest wywoływane za każdym razem, gdy wywołanie OnChildChanged
jest wywoływane przez aktualizację, która powoduje zmianę kolejności elementów podrzędnych. Jest on używany w przypadku danych uporządkowanych za pomocą funkcji OrderByChild
lub OrderByValue
.
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 też filtrować posortowane wyniki, aby uzyskać określoną liczbę wyników lub zakres kluczy lub wartości.
Sortowanie danych
Aby pobrać posortowane dane, zacznij od określenia jednej z metod sortowania, aby określić sposób sortowania wyników:
Metoda | Wykorzystanie |
---|---|
OrderByChild() |
Sortuje wyniki według wartości określonego klucza podrzędnego. |
OrderByKey()
| Sortuj wyniki według kluczy podrzędnych. |
OrderByValue() |
Sortuj wyniki według wartości elementów podrzędnych. |
Możesz używać tylko jednej metody zamawiania naraz. Wywołanie metody order-by kilka razy w tym samym zapytaniu powoduje błąd.
Poniższy przykład pokazuje, jak zasubskrybować tablicę wyników uporządkowaną 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 firebase::Query
, które w połączeniu z ValueListener synchronizuje klienta z tablicą wyników w bazie danych, uporządkowaną według wyniku każdego wpisu.
Więcej informacji o skutecznym strukturyzowaniu danych znajdziesz w artykule Strukturyzowanie bazy danych.
Wywołanie metody OrderByChild()
określa klucz podrzędny, według którego mają być uporządkowane wyniki. W tym przypadku wyniki są sortowane według wartości "score"
w każdym elemencie podrzędnym. Więcej informacji o kolejności innych typów danych znajdziesz w artykule Jak są uporządkowane dane zapytań.
Filtrowanie danych
Aby filtrować dane, możesz łączyć dowolne metody ograniczania lub zakresu z metodą sortowania podczas tworzenia zapytania.
Metoda | Wykorzystanie |
---|---|
LimitToFirst() |
Określa maksymalną liczbę elementów do zwrócenia z 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() |
Zwraca elementy o wartości klucza lub wartości większej lub równej podanej wartości, w zależności od wybranej metody sortowania. |
EndAt() |
Zwraca elementy mniejsze lub równe podanemu kluczowi lub wartości w zależności od wybranej metody sortowania. |
EqualTo() |
Zwraca elementy równe określonemu kluczowi lub wartości w zależności od wybranej metody sortowania. |
W przeciwieństwie do metod sortowania możesz łączyć wiele funkcji limitu lub zakresu.
Możesz np. połączyć metody StartAt()
i EndAt()
, aby ograniczyć wyniki do określonego zakresu wartości.
Nawet jeśli zapytanie zwraca tylko 1 wynik, migawka jest listą, tylko że zawiera 1 element.
Ograniczanie liczby wyników
Za pomocą metod LimitToFirst()
i LimitToLast()
możesz ustawić maksymalną liczbę dzieci, które mają być synchronizowane w przypadku danego wywołania zwrotnego. Jeśli na przykład użyjesz symbolu LimitToFirst()
, aby ustawić limit 100, początkowo otrzymasz tylko do 100 wywołań zwrotnych OnChildAdded
. Jeśli w bazie danych Firebase masz mniej niż 100 elementów, wywoływane jest wywołanie zwrotne OnChildAdded
dla każdego z nich.
W miarę zmian w produktach otrzymujesz wywołania zwrotne OnChildAdded
dla produktów, które pojawiają się w zapytaniu, i wywołania zwrotne OnChildRemoved
dla produktów, które z niego znikają, dzięki czemu łączna liczba pozostaje na poziomie 100.
Na przykład poniższy kod zwraca najwyższy wynik z tablicy 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.
Filtrowanie według klucza lub wartości
Możesz używać symboli StartAt()
, EndAt()
i EqualTo()
, aby wybierać dowolne punkty początkowe, końcowe i równoważne w zapytaniach. Może to być przydatne w przypadku stronicowania danych lub wyszukiwania elementów z elementami podrzędnymi, które mają określoną wartość.
Sposób uporządkowania danych zapytania
W tej sekcji wyjaśniamy, jak dane są sortowane za pomocą każdej z metod sortowania w klasie Query
.
OrderByChild
Gdy używasz OrderByChild()
, dane zawierające określony klucz podrzędny są porządkowane w ten sposób:
- Najpierw pojawiają się dzieci z wartością
null
dla określonego klucza dziecka. - Następnie wyświetlane są dzieci z wartością
false
dla określonego klucza podrzędnego. Jeśli kilka elementów podrzędnych ma wartośćfalse
, są one sortowane leksykograficznie według klucza. - Następnie wyświetlane są dzieci z wartością
true
dla określonego klucza podrzędnego. Jeśli kilka elementów podrzędnych ma wartośćtrue
, są one sortowane leksykograficznie według klucza. - Następnie pojawiają się 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ą w przypadku określonego węzła podrzędnego, są one sortowane według klucza.
- Ciągi znaków występują po liczbach i są sortowane leksykograficznie w kolejności rosnącej. Jeśli kilka węzłów podrzędnych ma tę samą wartość, są one uporządkowane leksykograficznie według klucza.
- Obiekty są umieszczane na końcu i sortowane leksykograficznie według klucza w kolejności rosnącej.
OrderByKey
Gdy używasz funkcji OrderByKey()
do sortowania danych, są one zwracane w kolejności rosnącej według klucza.
- Najpierw pojawiają się dzieci z kluczem, który można przeanalizować jako 32-bitową liczbę całkowitą, posortowane w kolejności rosnącej.
- Następnie pojawiają się dzieci z wartością tekstową jako kluczem, posortowane leksykograficznie w kolejności rosnącej.
OrderByValue
W przypadku korzystania z OrderByValue()
dzieci są uporządkowane według wartości. Kryteria sortowania są takie same jak w przypadku OrderByChild()
, z tym że zamiast wartości określonego klucza podrzędnego używana jest wartość węzła.