Praca z listami danych na platformach Apple

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

Uzyskaj FIRDatabaseReference

Aby odczytywać lub zapisywać dane z bazy danych, potrzebujesz instancji FIRDatabaseReference :

Szybki

Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
var ref: DatabaseReference!

ref = Database.database().reference()

Cel C

Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];

Listy do czytania i pisania

Dołącz do listy danych

Użyj metody childByAutoId , aby dołączyć dane do listy w aplikacjach dla wielu użytkowników. Metoda childByAutoId generuje unikalny klucz za każdym razem, gdy do określonego odwołania Firebase zostanie dodane nowe dziecko. Korzystając z tych automatycznie generowanych kluczy dla każdego nowego elementu na liście, kilku klientów może dodawać elementy podrzędne do tej samej lokalizacji w tym samym czasie bez konfliktów zapisu. Unikalny klucz generowany przez childByAutoId jest oparty na sygnaturze czasowej, więc elementy listy są automatycznie uporządkowane chronologicznie.

Możesz użyć odwołania do nowych danych zwróconych przez metodę childByAutoId , aby uzyskać wartość automatycznie wygenerowanego klucza lub zestawu danych dla dziecka. Wywołanie metody getKey na referencji childByAutoId zwraca automatycznie wygenerowany klucz.

Możesz użyć tych automatycznie generowanych kluczy, aby uprościć spłaszczanie struktury danych. Aby uzyskać więcej informacji, zobacz przykład rozkładania danych .

Słuchaj wydarzeń dla dzieci

Zdarzenia podrzędne są wyzwalane w odpowiedzi na określone operacje, które mają miejsce na elementach podrzędnych węzła z operacji, takich jak dodanie nowego elementu podrzędnego za pomocą metody childByAutoId lub zaktualizowanie elementu podrzędnego za pomocą metody updateChildValues .

Typ wydarzenia Typowe użycie
FIRDataEventTypeChildAdded Pobieraj listy elementów lub słuchaj dodatków do listy elementów. To zdarzenie jest wyzwalane raz dla każdego istniejącego elementu podrzędnego, a następnie ponownie za każdym razem, gdy do określonej ścieżki zostanie dodany nowy element podrzędny. Odbiornik otrzymuje migawkę zawierającą dane nowego dziecka.
FIRDataEventTypeChildChanged Słuchaj zmian pozycji na liście. To zdarzenie jest wyzwalane za każdym razem, gdy modyfikowany jest węzeł podrzędny. Obejmuje to wszelkie modyfikacje potomków węzła podrzędnego. Migawka przekazana do detektora zdarzeń zawiera zaktualizowane dane elementu podrzędnego.
FIRDataEventTypeChildRemoved Słuchaj, czy elementy są usuwane z listy. To zdarzenie jest wyzwalane po usunięciu bezpośredniego elementu podrzędnego. Migawka przekazana do bloku wywołania zwrotnego zawiera dane usuniętego elementu podrzędnego.
FIRDataEventTypeChildMoved Słuchaj zmian kolejności elementów na uporządkowanej liście. To zdarzenie jest wyzwalane za każdym razem, gdy aktualizacja powoduje zmianę kolejności elementu podrzędnego. Jest używany z danymi uporządkowanymi przez queryOrderedByChild lub queryOrderedByValue .

Każde z nich razem może być przydatne do nasłuchiwania zmian w określonym węźle w bazie danych. Na przykład aplikacja do blogowania społecznościowego może wykorzystywać te metody razem do monitorowania aktywności w komentarzach do posta, jak pokazano poniżej:

Szybki

Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
// Listen for new comments in the Firebase database
commentsRef.observe(.childAdded, with: { (snapshot) -> Void in
  self.comments.append(snapshot)
  self.tableView.insertRows(
    at: [IndexPath(row: self.comments.count - 1, section: self.kSectionComments)],
    with: UITableView.RowAnimation.automatic
  )
})
// Listen for deleted comments in the Firebase database
commentsRef.observe(.childRemoved, with: { (snapshot) -> Void in
  let index = self.indexOfMessage(snapshot)
  self.comments.remove(at: index)
  self.tableView.deleteRows(
    at: [IndexPath(row: index, section: self.kSectionComments)],
    with: UITableView.RowAnimation.automatic
  )
})

Cel C

Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
// Listen for new comments in the Firebase database
[_commentsRef
              observeEventType:FIRDataEventTypeChildAdded
              withBlock:^(FIRDataSnapshot *snapshot) {
                [self.comments addObject:snapshot];
                [self.tableView insertRowsAtIndexPaths:@[
                  [NSIndexPath indexPathForRow:self.comments.count - 1 inSection:kSectionComments]
                ]
                                      withRowAnimation:UITableViewRowAnimationAutomatic];
              }];
// Listen for deleted comments in the Firebase database
[_commentsRef
 observeEventType:FIRDataEventTypeChildRemoved
 withBlock:^(FIRDataSnapshot *snapshot) {
   int index = [self indexOfMessage:snapshot];
   [self.comments removeObjectAtIndex:index];
   [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:kSectionComments]]
                         withRowAnimation:UITableViewRowAnimationAutomatic];
 }];

Słuchaj wartościowych wydarzeń

Podczas gdy nasłuchiwanie zdarzeń podrzędnych jest zalecanym sposobem odczytywania list danych, istnieją sytuacje, w których nasłuchiwanie zdarzeń wartości w odwołaniu do listy jest przydatne.

Dołączenie obserwatora FIRDataEventTypeValue do listy danych zwróci całą listę danych jako pojedynczy DataSnapshot, który można następnie zapętlić, aby uzyskać dostęp do poszczególnych elementów podrzędnych.

Nawet jeśli istnieje tylko jedno dopasowanie do zapytania, migawka nadal jest listą; zawiera tylko jeden element. Aby uzyskać dostęp do elementu, musisz zapętlić wynik:

Szybki

Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

Cel C

Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
[_commentsRef
              observeEventType:FIRDataEventTypeValue
              withBlock:^(FIRDataSnapshot *snapshot) {
                // Loop over children
                NSEnumerator *children = [snapshot children];
                FIRDataSnapshot *child;
                while (child = [children nextObject]) {
                  // ...
                }
              }];

Ten wzorzec może być przydatny, gdy chcesz pobrać wszystkie elementy podrzędne listy w jednej operacji, zamiast nasłuchiwać dodatkowych zdarzeń dodanych podrzędnych.

Sortowanie i filtrowanie danych

Możesz użyć klasy FIRDatabaseQuery bazy danych czasu rzeczywistego, aby pobrać dane posortowane według klucza, wartości lub wartości elementu podrzędnego. Możesz także filtrować posortowany wynik do określonej liczby wyników lub zakresu kluczy lub wartości.

Sortuj dane

Aby pobrać posortowane dane, zacznij od określenia jednej z metod porządkowania w celu określenia kolejności wyników:

metoda Stosowanie
queryOrderedByKey Uporządkuj wyniki według kluczy potomnych.
queryOrderedByValue Uporządkuj wyniki według wartości podrzędnych.
queryOrderedByChild Uporządkuj wyniki według wartości określonego klucza podrzędnego lub zagnieżdżonej ścieżki podrzędnej.

W danym momencie możesz użyć tylko jednej metody zamawiania według. Wielokrotne wywołanie metody sortowania według w tym samym zapytaniu spowoduje zgłoszenie błędu.

Poniższy przykład pokazuje, jak można pobrać listę najlepszych postów użytkownika posortowaną według liczby gwiazdek:

Szybki

Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
// My top posts by number of stars
let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")

Cel C

Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
// My top posts by number of stars
FIRDatabaseQuery *myTopPostsQuery = [[[self.ref child:@"user-posts"]
                                      child:[super getUid]]
                                     queryOrderedByChild:@"starCount"];

To zapytanie pobiera posty użytkownika ze ścieżki w bazie danych na podstawie jego identyfikatora użytkownika, uporządkowane według liczby gwiazdek otrzymanych przez każdy post. Ta technika używania identyfikatorów jako kluczy indeksowych nazywana jest rozrzutem danych. Więcej informacji na ten temat można znaleźć w artykule Struktura bazy danych .

Wywołanie metody queryOrderedByChild określa klucz podrzędny, według którego mają zostać uporządkowane wyniki. W tym przykładzie posty są sortowane według wartości elementu "starCount" w każdym poście. Zapytania można również uporządkować według zagnieżdżonych elementów podrzędnych, jeśli masz dane, które wyglądają tak:

"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 takim przypadku możemy uporządkować nasze elementy listy według wartości zagnieżdżonych w kluczu metrics , określając względną ścieżkę do zagnieżdżonego elementu podrzędnego w naszym wywołaniu queryOrderedByChild .

Szybki

Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
 
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")

Cel C

Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
 
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];

Aby uzyskać więcej informacji na temat porządkowania innych typów danych, zobacz Jak uporządkowane są dane zapytania .

Filtrowanie danych

Aby filtrować dane, podczas konstruowania zapytania można połączyć dowolną metodę limitu lub zakresu z metodą porządkowania według.

metoda Stosowanie
queryLimitedToFirst Ustawia maksymalną liczbę elementów do zwrócenia od początku uporządkowanej listy wyników.
queryLimitedToLast Ustawia maksymalną liczbę elementów do zwrócenia z końca uporządkowanej listy wyników.
queryStartingAtValue Zwróć elementy większe lub równe określonemu kluczowi lub wartości, w zależności od wybranej metody porządkowania.
queryStartingAfterValue Zwróć elementy większe niż określony klucz lub wartość, w zależności od wybranej metody zamawiania.
queryEndingAtValue Zwracaj przedmioty mniejsze lub równe określonemu kluczowi lub wartości, w zależności od wybranej metody zamawiania.
queryEndingBeforeValue Zwracaj przedmioty mniejsze niż określony klucz lub wartość, w zależności od wybranej metody zamawiania.
queryEqualToValue Zwróć elementy równe określonemu kluczowi lub wartości, w zależności od wybranej metody zamawiania.

W przeciwieństwie do metod sortowania według, można łączyć wiele funkcji limitów lub zakresów. Można na przykład połączyć metody queryStartingAtValue i queryEndingAtValue , aby ograniczyć wyniki do określonego zakresu wartości.

Ogranicz liczbę wyników

Za pomocą metod queryLimitedToFirst i queryLimitedToLast można ustawić maksymalną liczbę dzieci do zsynchronizowania dla danego wywołania zwrotnego. Na przykład, jeśli użyjesz queryLimitedToFirst do ustawienia limitu 100, początkowo otrzymasz tylko do 100 wywołań zwrotnych FIRDataEventTypeChildAdded . Jeśli masz mniej niż 100 elementów przechowywanych w bazie danych Firebase, wywołanie zwrotne FIRDataEventTypeChildAdded jest uruchamiane dla każdego elementu.

Gdy elementy się zmieniają, otrzymujesz wywołania zwrotne FIRDataEventTypeChildAdded dla elementów, które wchodzą w zapytanie, i wywołania zwrotne FIRDataEventTypeChildRemoved dla elementów, które z niego wypadają, dzięki czemu łączna liczba pozostaje na poziomie 100.

Poniższy przykład pokazuje, jak przykładowa aplikacja do blogowania może pobrać listę 100 najnowszych postów wszystkich użytkowników:

Szybki

Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
let recentPostsQuery = (ref?.child("posts").queryLimited(toFirst: 100))!

Cel C

Uwaga: ten produkt Firebase nie jest dostępny w docelowym klipie aplikacji.
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
FIRDatabaseQuery *recentPostsQuery = [[self.ref child:@"posts"] queryLimitedToFirst:100];

Filtruj według klucza lub wartości

Możesz użyć queryStartingAtValue , queryStartingAfterValue , queryEndingAtValue , queryEndingBeforeValue i queryEqualToValue , aby wybrać dowolne punkty początkowe, końcowe i równoważne dla zapytań. Może to być przydatne do dzielenia danych na strony lub znajdowania elementów z elementami podrzędnymi, które mają określoną wartość.

Jak uporządkowane są dane zapytania

W tej sekcji wyjaśniono, w jaki sposób dane są sortowane według każdej z metod sortowania według w klasie FIRDatabaseQuery .

queryOrderedByKey

Podczas korzystania z queryOrderedByKey do sortowania danych dane są zwracane w porządku rosnącym według klucza.

  1. Dzieci z kluczem, który można przeanalizować jako 32-bitową liczbę całkowitą, są pierwsze, posortowane w porządku rosnącym.
  2. Dzieci z wartością ciągu jako kluczem są następne, posortowane leksykograficznie w porządku rosnącym.

queryOrderedByValue

Podczas korzystania z queryOrderedByValue są sortowane według ich wartości. Kryteria porządkowania są takie same jak w queryOrderedByChild , z tą różnicą, że zamiast wartości określonego klucza podrzędnego używana jest wartość węzła.

queryOrderedByChild

Podczas korzystania z queryOrderedByChild dane zawierające określony klucz podrzędny są uporządkowane w następujący sposób:

  1. Dzieci z wartością nil dla określonego klucza potomnego są pierwsze.
  2. Dzieci z wartością false dla określonego klucza potomnego są następne. Jeśli wiele elementów podrzędnych ma wartość false , są one sortowane leksykograficznie według klucza.
  3. Dzieci z wartością true dla określonego klucza podrzędnego są następne. Jeśli wiele elementów podrzędnych ma wartość true , są one sortowane leksykograficznie według klucza.
  4. Następne są dzieci z wartością liczbową, posortowane rosnąco. Jeśli wiele elementów podrzędnych ma tę samą wartość liczbową dla określonego węzła podrzędnego, są one sortowane według klucza.
  5. Ciągi występują po liczbach i są sortowane leksykograficznie w porządku rosnącym. Jeśli wiele elementów podrzędnych ma tę samą wartość dla określonego węzła podrzędnego, są one uporządkowane leksykograficznie według klucza.
  6. Obiekty są na końcu i są sortowane leksykograficznie według klucza w porządku rosnącym.

Odłącz słuchaczy

Obserwatorzy nie przestają automatycznie synchronizować danych po opuszczeniu ViewController . Jeśli obserwator nie zostanie prawidłowo usunięty, nadal synchronizuje dane z pamięcią lokalną i zachowa wszelkie obiekty przechwycone w zamknięciu procedury obsługi zdarzeń, co może spowodować przecieki pamięci. Gdy obserwator nie jest już potrzebny, usuń go, przekazując powiązany FIRDatabaseHandle do metody removeObserverWithHandle .

Po dodaniu bloku wywołania zwrotnego do odwołania zwracany jest FIRDatabaseHandle . Te uchwyty mogą służyć do usuwania bloku wywołania zwrotnego.

Jeśli do odwołania do bazy danych dodano wielu detektorów, każdy detektor jest wywoływany, gdy zostanie zgłoszone zdarzenie. Aby zatrzymać synchronizację danych w tej lokalizacji, należy usunąć wszystkich obserwatorów z danej lokalizacji, wywołując metodę removeAllObservers .

Wywołanie removeObserverWithHandle lub removeAllObservers na odbiorniku nie powoduje automatycznego usunięcia detektorów zarejestrowanych w jego węzłach podrzędnych; musisz także śledzić te odniesienia lub uchwyty, aby je usunąć.

Następne kroki