Pobieram dane

Ten dokument zawiera podstawowe informacje o pobieraniu danych oraz ich porządkowaniu i filtrowaniu. danych Firebase.

Zanim zaczniesz

Zanim będzie można użyć Baza danych czasu rzeczywistego, musisz:

  • Zarejestruj projekt Unity i skonfiguruj go pod kątem korzystania z Firebase.

    • Jeśli Twój projekt w Unity korzysta już z Firebase, zarejestrowane i skonfigurowane w Firebase.

    • Jeśli nie masz projektu Unity, możesz pobrać przykładowej aplikacji.

  • Dodaj pakiet SDK Firebase Unity (a konkretnie FirebaseDatabase.unitypackage) do swojego projektu w Unity.

.

Pamiętaj, że dodanie Firebase do projektu Unity wymaga wykonania zadań zarówno w w konsoli Firebase i w otwartym projekcie Unity. (np. pobierasz z konsoli pliki konfiguracyjne Firebase, do swojego projektu Unity).

Pobieram dane

Dane Firebase są pobierane przez jednorazowe wywołanie GetValueAsync() lub dołączanie do wydarzenia w pliku referencyjnym FirebaseDatabase. Detektor zdarzeń to jest wywoływane raz dla początkowego stanu danych i ponownie przy każdej zmianie.

Pobieranie odniesienia do bazy danych

Aby odczytać dane z bazy danych, potrzebujesz instancji DatabaseReference:

using Firebase;
using Firebase.Database;
using Firebase.Extensions.TaskExtension; // for ContinueWithOnMainThread

public class MyScript: MonoBehaviour {
  void Start() {
    // Get the root reference location of the database.
    DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference;
  }
}

Odczytaj dane raz

Za pomocą metody GetValueAsync 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.

    FirebaseDatabase.DefaultInstance
      .GetReference("Leaders")
      .GetValueAsync().ContinueWithOnMainThread(task => {
        if (task.IsFaulted) {
          // Handle the error...
        }
        else if (task.IsCompleted) {
          DataSnapshot snapshot = task.Result;
          // Do something with snapshot...
        }
      });

Nasłuchiwanie zdarzeń

Możesz dodać detektory zdarzeń, aby subskrybować zmiany danych:

Zdarzenie Typowe zastosowanie
ValueChanged Odczyt i nasłuchiwanie zmian w całej zawartości ścieżki.
ChildAdded Pobieranie list elementów lub słuchanie, czy dodano elementy do listy. Sugerowane zastosowanie z tymi funkcjami: ChildChanged i ChildRemoved, aby monitorować zmiany na listach.
ChildChanged Wykrywaj zmiany wprowadzone w elementach na liście. Używaj z ChildAdded i ChildRemoved do monitorowania zmian na listach.
ChildRemoved Nasłuchuj elementów usuwanych z listy. Używaj z ChildAdded i ChildChanged do monitorowania zmian na listach.
ChildMoved Wykrywaj zmiany kolejności elementów na liście uporządkowanej. Wydarzenia (ChildMoved) zawsze występują po ChildChanged – zdarzenie, które spowodowało zamówienie tego produktu na (w zależności od bieżącej metody sortowania).

Zdarzenie ValueChanged

Możesz użyć zdarzenia ValueChanged, aby zasubskrybować informacje o zmianach w usłudze treści na danej ścieżce. To zdarzenie jest wywoływane raz, gdy detektor jest za każdym razem, gdy dane, w tym elementy podrzędne, zostaną zmienione. Wywołanie zwrotne zdarzenia jest przekazywane do zrzutu zawierającego wszystkie dane w tej 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:

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders")
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

ValueChangedEventArgs zawiera element DataSnapshot zawierający dane w określoną lokalizację w bazie danych w momencie wystąpienia zdarzenia. Dzwonię pod Value zwraca wartość Dictionary<string, object> reprezentującą dane. Jeśli w danej lokalizacji nie ma danych, wywołanie funkcji Value zwróci wartość null.

W tym przykładzie funkcja args.DatabaseError jest również sprawdzana w celu sprawdzenia, czy odczyt anulowano. Odczyt można anulować na przykład, jeśli klient nie ma uprawnienia do odczytu z lokalizacji bazy danych Firebase. DatabaseError poinformuje o przyczynie wystąpienia błędu.

Później możesz anulować subskrypcję tego wydarzenia za pomocą dowolnej usługi DatabaseReference, która ma tę samą ścieżkę. DatabaseReference instancja jest efemeryczna i można ją rozważyć jako sposób na dostęp do dowolnej ścieżki i zapytania.

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders")
        .ValueChanged -= HandleValueChanged; // unsubscribe from ValueChanged.
    }

Zdarzenia podrzędne

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 Push() lub element podrzędny aktualizowany za pomocą interfejsu UpdateChildrenAsync() . 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:

      var ref = FirebaseDatabase.DefaultInstance
      .GetReference("GameSessionComments");

      ref.ChildAdded += HandleChildAdded;
      ref.ChildChanged += HandleChildChanged;
      ref.ChildRemoved += HandleChildRemoved;
      ref.ChildMoved += HandleChildMoved;
    }

    void HandleChildAdded(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildChanged(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildRemoved(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

    void HandleChildMoved(object sender, ChildChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

Zdarzenie ChildAdded jest zwykle używane do pobierania listy elementy w bazie danych Firebase. Zdarzenie ChildAdded jest wywoływane jednokrotnie 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.

Zdarzenie ChildChanged jest wywoływane po każdej modyfikacji węzła podrzędnego. Obejmuje to wszelkie modyfikacje elementów podrzędnych węzła podrzędnego. Jest zwykle używane w połączeniu z ChildAdded i ChildRemoved zdarzenia w odpowiedzi na zmiany na liście elementów. Zrzut przekazany do detektor zdarzeń zawiera zaktualizowane dane elementu podrzędnego.

Zdarzenie ChildRemoved jest wyzwalane po usunięciu natychmiastowego elementu podrzędnego. Jest zwykle używany w połączeniu z parametrami ChildAdded i ChildChanged wywołań zwrotnych. Zrzut przekazany do wywołania zwrotnego zdarzenia zawiera dane usuniętego konta dziecka.

Zdarzenie ChildMoved jest wywoływane zawsze, gdy ChildChanged jest wywoływane 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.

Ten przykład pokazuje, jak zasubskrybować wynik Tabela wyników posortowana według wyniku.

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders").OrderByChild("score")
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

Definiuje zapytanie, które w połączeniu z detektorem zdarzeń valuechanged synchronizuje klienta z tabelą wyników w bazie danych w kolejności według punkty za każde zadanie. 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 ChildAdded. Jeśli na bazy danych Firebase, dla każdego elementu uruchamia się wywołanie zwrotne ChildAdded.

W miarę zmiany elementów otrzymujesz ChildAdded wywołań zwrotnych dla elementów, które zostały wprowadzone oraz wywołania zwrotne ChildRemoved 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:

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders").OrderByChild("score").LimitToLast(1)
        .ValueChanged += HandleValueChanged;
    }

    void HandleValueChanged(object sender, ValueChangedEventArgs args) {
      if (args.DatabaseError != null) {
        Debug.LogError(args.DatabaseError.Message);
        return;
      }
      // Do something with the data in args.Snapshot
    }

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.