Korzystanie z list danych na platformach Apple

Pobieranie FIRDatabaseReference

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

Swift

Uwaga: ta usługa Firebase nie jest dostępna w przypadku celu App Clip.
var ref: DatabaseReference!

ref = Database.database().reference()

Objective-C

Uwaga: ta usługa Firebase nie jest dostępna w przypadku celu App Clip.
@property (strong, nonatomic) FIRDatabaseReference *ref;

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

Listy do przeczytania 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 dodawany jest nowy element podrzędny. Dzięki użyciu tych wygenerowanych automatycznie kluczy dla każdego nowego elementu na liście kilku klientów może jednocześnie dodawać elementy podrzędne do tej samej lokalizacji bez konfliktów zapisu. Unikalny klucz generowany przez childByAutoId jest oparty na sygnaturze czasowej, więc elementy listy są automatycznie porządkowane chronologicznie.

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

Możesz użyć tych wygenerowanych automatycznie kluczy, aby uprościć spłaszczanie struktury danych. Więcej informacji znajdziesz w przykładzie rozsyłania danych.

Nasłuchiwanie zdarzeń podrzędnych

Zdarzenia podrzędne są wywoływane w odpowiedzi na określone operacje, które mają miejsce w przypadku elementów podrzędnych węzła, np. dodanie nowego elementu podrzędnego za pomocą metody childByAutoId lub zaktualizowanie elementu podrzędnego za pomocą metody updateChildValues.

Typ zdarzenia Typowe zastosowanie
FIRDataEventTypeChildAdded pobierać listy elementów lub nasłuchiwać dodawania elementów do listy; To zdarzenie jest wywoływane raz dla każdego istniejącego elementu podrzędnego, a następnie za każdym razem, gdy do określonej ścieżki zostanie dodany nowy element podrzędny. Do detektora przekazywany jest zrzut zawierający dane nowego elementu podrzędnego.
FIRDataEventTypeChildChanged Sprawdzanie zmian w elementach na liście. To zdarzenie jest wywoływane za każdym razem, gdy węzeł podrzędny zostanie zmodyfikowany. Obejmuje to wszelkie zmiany elementów podrzędnych węzła podrzędnego. Zrzut przekazany do detektora zdarzeń zawiera zaktualizowane dane elementu podrzędnego.
FIRDataEventTypeChildRemoved Nasłuchuj usuwania elementów z listy. To zdarzenie jest wywoływane, gdy usunięte zostanie bezpośrednie dziecko.Zrzut przekazany do bloku wywołania zwrotnego zawiera dane usuniętego dziecka.
FIRDataEventTypeChildMoved nasłuchiwanie zmian kolejności elementów na liście uporządkowanej; To zdarzenie jest wywoływane, gdy aktualizacja powoduje zmianę kolejności elementu podrzędnego. Jest używana z danymi uporządkowanymi według queryOrderedByChild lub queryOrderedByValue.

Każda z tych metod może być przydatna do nasłuchiwania zmian w konkretnym węźle bazy danych. Na przykład aplikacja do blogowania społecznościowego może używać tych metod razem do monitorowania aktywności w komentarzach do posta, jak pokazano poniżej:

Swift

Uwaga: ta usługa Firebase nie jest dostępna w przypadku celu App Clip.
// 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
  )
})

Objective-C

Uwaga: ta usługa Firebase nie jest dostępna w przypadku celu App Clip.
// 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];
 }];

Nasłuchiwanie zdarzeń wartości

Chociaż nasłuchiwanie zdarzeń podrzędnych jest zalecanym sposobem odczytywania list danych, w niektórych sytuacjach przydatne jest nasłuchiwanie zdarzeń wartości w odniesieniu do listy.

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

Nawet jeśli zapytanie ma tylko jedno dopasowanie, zrzut nadal jest listą, ale zawiera tylko jeden element. Aby uzyskać dostęp do elementu, musisz wykonać pętlę po wyniku:

Swift

Uwaga: ta usługa Firebase nie jest dostępna w przypadku celu App Clip.
_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

Objective-C

Uwaga: ta usługa Firebase nie jest dostępna w przypadku celu App Clip.
[_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 ramach jednej operacji, zamiast nasłuchiwać dodatkowych zdarzeń dodania elementu podrzędnego.

Sortowanie i filtrowanie danych

Możesz użyć klasy Realtime Database FIRDatabaseQuery, 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 bądź wartości.

Sortowanie danych

Aby pobrać posortowane dane, zacznij od określenia jednej z metod sortowania, która określi sposób porządkowania wyników:

Metoda Wykorzystanie
queryOrderedByKey Porządkuj wyniki według kluczy podrzędnych.
queryOrderedByValue Porządkowanie wyników według wartości podrzędnych.
queryOrderedByChild Porządkuj wyniki według wartości określonego klucza podrzędnego lub zagnieżdżonej ścieżki podrzędnej.

Możesz używać tylko jednej metody sortowania naraz. Wielokrotne wywołanie metody sortowania w tym samym zapytaniu powoduje błąd.

Poniższy przykład pokazuje, jak pobrać listę najpopularniejszych postów użytkownika posortowanych według liczby gwiazdek:

Swift

Uwaga: ta usługa Firebase nie jest dostępna w przypadku celu App Clip.
// My top posts by number of stars
let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")

Objective-C

Uwaga: ta usługa Firebase nie jest dostępna w przypadku celu App Clip.
// 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, które otrzymał każdy post. Ta technika używania identyfikatorów jako kluczy indeksu jest nazywana rozgałęzieniem danych. Więcej informacji na ten temat znajdziesz w artykule Struktura bazy danych.

Wywołanie metody queryOrderedByChild określa klucz podrzędny, według którego mają być sortowane wyniki. W tym przykładzie posty są sortowane według wartości elementu podrzędnego "starCount" w każdym poście. Zapytania można też porzą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 tym przypadku możemy uporządkować elementy listy według wartości zagnieżdżonych pod kluczem metrics, określając ścieżkę względną do zagnieżdżonego elementu podrzędnego w wywołaniu queryOrderedByChild.

Swift

Uwaga: ta usługa Firebase nie jest dostępna w przypadku celu App Clip.
 
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")

Objective-C

Uwaga: ta usługa Firebase nie jest dostępna w przypadku celu App Clip.
 
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];

Więcej informacji o porządkowaniu innych typów danych znajdziesz w artykule Jak są porządkowane dane zapytań.

Filtrowanie danych

Aby filtrować dane, podczas tworzenia zapytania możesz połączyć dowolną metodę limitu lub zakresu z metodą sortowania.

Metoda Wykorzystanie
queryLimitedToFirst Określa maksymalną liczbę elementów do zwrócenia od początku listy uporządkowanej wyników.
queryLimitedToLast Ustawia maksymalną liczbę elementów do zwrócenia z końca uporządkowanej listy wyników.
queryStartingAtValue Zwraca elementy większe niż określony klucz lub wartość albo im równe, w zależności od wybranej metody sortowania.
queryStartingAfterValue Zwraca elementy o wartości większej niż określony klucz lub wartość, w zależności od wybranej metody sortowania.
queryEndingAtValue Zwraca elementy mniejsze niż określony klucz lub wartość albo im równe, w zależności od wybranej metody sortowania.
queryEndingBeforeValue Zwraca elementy mniejsze niż określony klucz lub wartość, w zależności od wybranej metody sortowania.
queryEqualToValue 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 możesz łączyć wiele funkcji limitu lub zakresu. Możesz na przykład połączyć metody queryStartingAtValue i queryEndingAtValue, aby ograniczyć wyniki do określonego zakresu wartości.

Ograniczanie liczby wyników

Możesz użyć metod queryLimitedToFirst i queryLimitedToLast, aby ustawić maksymalną liczbę elementów podrzędnych do zsynchronizowania w przypadku danego wywołania zwrotnego. Jeśli na przykład użyjesz queryLimitedToFirst, aby ustawić limit 100, początkowo otrzymasz tylko maksymalnie 100 wywołań zwrotnych FIRDataEventTypeChildAdded. Jeśli w bazie danych Firebase masz mniej niż 100 elementów, dla każdego z nich zostanie wywołane wywołanie zwrotne FIRDataEventTypeChildAdded.

W miarę zmian elementów otrzymujesz wywołania zwrotne FIRDataEventTypeChildAdded dla elementów, które pojawiają się w zapytaniu, 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:

Swift

Uwaga: ta usługa Firebase nie jest dostępna w przypadku celu App Clip.
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
let recentPostsQuery = (ref?.child("posts").queryLimited(toFirst: 100))!

Objective-C

Uwaga: ta usługa Firebase nie jest dostępna w przypadku celu App Clip.
// 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ć metod 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 o określonej wartości.

Jak są uporządkowane dane z zapytań

W tej sekcji wyjaśniamy, jak dane są sortowane według poszczególnych metod sortowania w klasie FIRDatabaseQuery.

queryOrderedByKey

Gdy używasz queryOrderedByKey do sortowania danych, są one zwracane w kolejności rosnącej według klucza.

  1. Najpierw wyświetlane są elementy podrzędne z kluczem, który można przeanalizować jako 32-bitową liczbę całkowitą, posortowane w kolejności rosnącej.
  2. Następnie wyświetlane są elementy podrzędne z wartością ciągu znaków jako kluczem, posortowane leksykograficznie w porządku rosnącym.

queryOrderedByValue

Gdy używasz queryOrderedByValue, elementy podrzędne są uporządkowane według wartości. Kryteria sortowania są takie same jak w przypadku queryOrderedByChild, ale zamiast wartości określonego klucza podrzędnego używana jest wartość węzła.

queryOrderedByChild

Gdy używasz metody queryOrderedByChild, dane zawierające określony klucz podrzędny są porządkowane w ten sposób:

  1. Dzieci z wartością nil dla określonego klucza podrzędnego są wyświetlane jako pierwsze.
  2. Następnie wyświetlane są elementy podrzędne z wartością false dla określonego klucza podrzędnego. Jeśli wiele elementów podrzędnych ma wartość false, są one sortowane leksykograficznie według klucza.
  3. Następnie wyświetlane są elementy podrzędne z wartością true dla określonego klucza podrzędnego. Jeśli wiele elementów podrzędnych ma wartość true, są one sortowane leksykograficznie według klucza.
  4. Następnie wyświetlane 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ą dla określonego węzła podrzędnego, są one sortowane według klucza.
  5. Ciągi znaków występują po liczbach i są sortowane leksykograficznie w kolejności rosnącej. 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 kolejności rosnącej.

Odłączanie detektorów

Obserwatorzy nie przestają automatycznie synchronizować danych, gdy opuścisz ViewController. Jeśli obserwator nie zostanie prawidłowo usunięty, będzie nadal synchronizować dane z pamięcią lokalną i zachowa wszystkie obiekty przechwycone w zamknięciu modułu obsługi zdarzeń, co może powodować wycieki pamięci. Gdy obserwator nie jest już potrzebny, usuń go, przekazując powiązany obiekt FIRDatabaseHandle do metody removeObserverWithHandle.

Gdy dodasz blok wywołania zwrotnego do odwołania, zwracany jest obiekt FIRDatabaseHandle. Te uchwyty mogą służyć do usuwania bloku wywołania zwrotnego.

Jeśli do odwołania do bazy danych dodano wiele detektorów, każdy z nich jest wywoływany po wystąpieniu zdarzenia. Aby zatrzymać synchronizowanie danych w tej lokalizacji, musisz usunąć wszystkich obserwatorów w lokalizacji, wywołując metodę removeAllObservers.

Wywołanie metody removeObserverWithHandle lub removeAllObservers na obiekcie nasłuchującym nie powoduje automatycznego usunięcia obiektów nasłuchujących zarejestrowanych w jego węzłach podrzędnych. Aby je usunąć, musisz też śledzić te odwołania lub uchwyty.

Następne kroki