Korzystanie z list danych na platformach Apple

Pobieranie FIRDatabaseReference

Aby odczytywać lub zapisywać dane w bazie danych, potrzebujesz instancji FIRDatabaseReference:

Swift

Uwaga: ta usługa Firebase nie jest dostępna w przypadku klipów z aplikacji.
var ref: DatabaseReference!

ref = Database.database().reference()

Objective-C

Uwaga: ta usługa Firebase nie jest dostępna w przypadku klipów z aplikacji.
@property (strong, nonatomic) FIRDatabaseReference *ref;

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

Listy czytelnicze i listy do pisania

Dołączanie do listy danych

Użyj metody childByAutoId, aby dołączyć dane do listy w aplikacjach wielodostępnych. Metoda childByAutoId generuje unikalny klucz za każdym razem, gdy do określonego odwołania Firebase dodawane jest nowe dziecko. Dzięki używaniu 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 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 elementu podrzędnego. Wywołanie funkcji getKey na odwołaniu childByAutoId zwraca klucz wygenerowany automatycznie.

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

Nasłuchiwanie zdarzeń dotyczących dziecka

Zdarzenia dotyczące elementów podrzędnych są wywoływane w odpowiedzi na określone operacje wykonywane na elementach 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 potem ponownie za każdym razem, gdy do określonej ścieżki zostanie dodany nowy element podrzędny. Do odbiorcy przekazywany jest zrzut zawierający nowe dane dziecka.
FIRDataEventTypeChildChanged Monitorowanie 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 modyfikacje elementów podrzędnych węzła podrzędnego. Zrzut przekazywany do odbiornika zdarzeń zawiera zaktualizowane dane dotyczące elementu podrzędnego.
FIRDataEventTypeChildRemoved Nasłuchiwanie elementów usuwanych z listy. To zdarzenie jest wywoływane, gdy zostanie usunięty bezpośredni element podrzędny.Zrzut przekazywany do bloku wywołania zwrotnego zawiera dane usuniętego elementu podrzędnego.
FIRDataEventTypeChildMoved Nasłuchiwanie zmian kolejności elementów na liście numerowanej. To zdarzenie jest wywoływane za każdym razem, gdy aktualizacja powoduje zmianę kolejności elementu podrzędnego. Jest używany w przypadku danych uporządkowanych według queryOrderedByChild lub queryOrderedByValue.

Każda z tych funkcji może być przydatna do śledzenia zmian w określonym węźle w bazie 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 klipów z 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
  )
})

Objective-C

Uwaga: ta usługa Firebase nie jest dostępna w przypadku klipów z 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];
 }];

Nasłuchiwanie zdarzeń wartości

Nasłuchiwanie zdarzeń podrzędnych to zalecany sposób odczytywania list danych, ale 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, po którym możesz iterować, aby uzyskać dostęp do poszczególnych elementów podrzędnych.

Nawet jeśli zapytanie zwraca tylko 1 wynik, migawka jest listą, która zawiera tylko 1 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 klipów z aplikacji.
_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

Objective-C

Uwaga: ta usługa Firebase nie jest dostępna w przypadku klipów z 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 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 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
queryOrderedByKey Sortuj wyniki według kluczy podrzędnych.
queryOrderedByValue Sortuj wyniki według wartości elementów podrzędnych.
queryOrderedByChild Sortowanie wyników według wartości określonego klucza podrzędnego lub zagnieżdżonej ścieżki podrzędnej.

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 pobrać listę najpopularniejszych postów użytkownika posortowanych według liczby gwiazdek:

Swift

Uwaga: ta usługa Firebase nie jest dostępna w przypadku klipów z aplikacji.
// 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 klipów z 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. Technika używania identyfikatorów jako kluczy indeksu nazywa się rozgałęzianiem 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ć uporządkowane 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 w takim formacie:

"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ć elementy listy według wartości zagnieżdżonych pod kluczem metrics, podając względną ścieżkę do zagnieżdżonego elementu podrzędnego w wywołaniu queryOrderedByChild.

Swift

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

Objective-C

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

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
queryLimitedToFirst Określa maksymalną liczbę elementów do zwrócenia z 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 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.
queryStartingAfterValue Zwraca elementy o wartości większej niż określony klucz lub wartość, w zależności od wybranej metody sortowania.
queryEndingAtValue Zwraca produkty o wartości klucza lub wartości mniejszej lub równej określonej wartości, w zależności od wybranej metody sortowania.
queryEndingBeforeValue Zwraca produkty o wartości mniejszej niż określony klucz lub wartość, w zależności od wybranej metody sortowania.
queryEqualToValue 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 queryStartingAtValuequeryEndingAtValue, aby ograniczyć wyniki do określonego zakresu wartości.

Ograniczanie liczby wyników

Za pomocą metod queryLimitedToFirstqueryLimitedToLast 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 queryLimitedToFirst, aby ustawić limit 100, początkowo otrzymasz tylko do 100 wywołań zwrotnych FIRDataEventTypeChildAdded. Jeśli w bazie danych Firebase masz mniej niż 100 elementów, wywoływane jest wywołanie zwrotne FIRDataEventTypeChildAdded dla każdego z nich.

W miarę zmian w produktach otrzymujesz wywołania zwrotne FIRDataEventTypeChildAdded dla produktów, które pojawiają się w zapytaniu, i wywołania zwrotne FIRDataEventTypeChildRemoved dla produktów, które z niego znikają, 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 klipów z 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))!

Objective-C

Uwaga: ta usługa Firebase nie jest dostępna w przypadku klipów z 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];

Filtrowanie według klucza lub wartości

Możesz użyć zasad queryStartingAtValue, queryStartingAfterValue, queryEndingAtValue, queryEndingBeforeValuequeryEqualToValue, aby wybrać dowolne punkty początkowe, końcowe i równoważne dla zapytań. Może to być przydatne w przypadku stronicowania danych lub wyszukiwania elementów podrzędnych o określonej wartości.

Sposób uporządkowania danych zapytania

W tej sekcji wyjaśniamy, jak dane są sortowane za pomocą każdej z metod sortowania w klasie FIRDatabaseQuery.

queryOrderedByKey

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

  1. Najpierw pojawiają się dzieci z kluczem, który można przeanalizować jako 32-bitową liczbę całkowitą, posortowane w kolejności rosnącej.
  2. Następnie pojawiają się dzieci z wartością tekstową jako kluczem, posortowane leksykograficznie w kolejności rosnącej.

queryOrderedByValue

W przypadku korzystania z queryOrderedByValue dzieci są uporządkowane według wartości. Kryteria sortowania są takie same jak w przypadku queryOrderedByChild, z tym że zamiast wartości określonego klucza podrzędnego używana jest wartość węzła.

queryOrderedByChild

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

  1. Najpierw pojawiają się dzieci z wartością nil dla określonego klucza dziecka.
  2. 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.
  3. 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.
  4. 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.
  5. 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.
  6. Obiekty są umieszczane na końcu i 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 procedury obsługi zdarzeń, co może powodować wycieki pamięci. Gdy obserwator nie jest już potrzebny, usuń go, przekazując powiązany z nim FIRDatabaseHandle do metody removeObserverWithHandle.

Gdy dodasz blok wywołania zwrotnego do odwołania, zwracana jest wartość FIRDatabaseHandle. Za pomocą tych uchwytów możesz usunąć blok wywołania zwrotnego.

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

Wywołanie removeObserverWithHandle lub removeAllObservers na odbiorniku nie powoduje automatycznego usunięcia odbiorników zarejestrowanych w jego węzłach podrzędnych. Musisz również śledzić te odwołania lub uchwyty, aby je usunąć.

Następne kroki