Pobieranie danych za pomocą Bazy danych czasu rzeczywistego Firebase dla C++

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 jest 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&ltDataSnapshot&gt 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 Query Bazy danych czasu rzeczywistego, 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 najwyższy 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:

  1. Elementy podrzędne z wartością null określonego klucza podrzędnego są dostarczane .
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. 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.

  1. 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.
  2. 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.

Następne kroki