Korzystanie z list danych na platformach Apple

Pobieranie odniesienia do bazy danych FIRDatabase

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

Swift

Uwaga: ta usługa Firebase nie jest dostępna w celu wycinka aplikacji.
var ref: DatabaseReference!

ref = Database.database().reference()

Objective-C

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

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

Czytam i zapisuję listy

Dołącz do listy danych

Użyj metody childByAutoId, aby dołączyć dane do listy w aplikacjach, które mają wielu użytkowników. Metoda childByAutoId generuje unikalny klucz za każdym razem, gdy do określonego odwołania Firebase jest dodawane nowe elementy podrzędne. Dzięki użyciu 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 jednocześnie bez konfliktów zapisu. Unikalny klucz wygenerowany przez funkcję 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 wydawcy podrzędnego lub ustawić dane dla elementu podrzędnego. Wywołanie getKey w pliku referencyjnym childByAutoId zwraca klucz wygenerowany automatycznie.

Możesz użyć tych automatycznie wygenerowanych kluczy, aby uprościć strukturę danych. Więcej informacji znajdziesz w przykładzie rozpowszechniania danych.

Nasłuchuj zdarzeń podrzędnych

Zdarzenia podrzędne są wywoływane w odpowiedzi na określone operacje wykonywane na elementach podrzędnych węzła w wyniku operacji, np. dodania nowego elementu podrzędnego za pomocą metody childByAutoId lub aktualizacji elementu podrzędnego za pomocą metody updateChildValues.

Typ zdarzenia Typowe zastosowanie
FIRDataEventTypeChildAdded Pobieranie list elementów lub słuchanie, czy dodano elementy 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 dodajesz nowy element podrzędny. Detektor przekazuje zrzut zawierający dane nowego elementu podrzędnego.
FIRDataEventTypeChildChanged Wykrywaj zmiany wprowadzone w elementach na liście. To zdarzenie jest wywoływane za każdym razem, gdy zmodyfikowany jest węzeł podrzędny. Obejmuje to wszelkie modyfikacje elementów podrzędnych węzła podrzędnego. Zrzut przekazany do detektora zdarzeń zawiera zaktualizowane dane obiektu podrzędnego.
FIRDataEventTypeChildRemoved Nasłuchuj elementów usuwanych z listy. To zdarzenie jest wyzwalane po usunięciu natychmiastowego elementu podrzędnego.Zrzut przekazany do bloku wywołania zwrotnego zawiera dane usuniętego elementu podrzędnego.
FIRDataEventTypeChildMoved Wykrywaj zmiany kolejności elementów na liście uporządkowanej. To zdarzenie jest wywoływane za każdym razem, gdy aktualizacja powoduje zmianę kolejności elementów podrzędnych. Jest używany z danymi uporządkowanymi według queryOrderedByChild lub queryOrderedByValue.

Każdy z tych elementów może być przydatny do nasłuchiwania zmian w konkretnym węźle w bazie danych. Na przykład aplikacja do obsługi blogów społecznościowych może wykorzystywać te metody razem do monitorowania aktywności w komentarzach do posta, jak w tym przykładzie:

Swift

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

Wykrywaj zdarzenia dotyczące wartości

Chociaż nasłuchiwanie zdarzeń podrzędnych to zalecany sposób 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 spowoduje zwrócenie całej listy danych w postaci pojedynczego zrzutu danych, który można później zapętlić w celu uzyskania dostępu do poszczególnych elementów podrzędnych.

Nawet jeśli dla zapytania występuje tylko jedno dopasowanie, zrzut nadal pozostaje listą, zawiera tylko 1 element. Aby uzyskać dostęp do elementu, musisz zapętlić wynik:

Swift

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

Objective-C

Uwaga: ta usługa Firebase nie jest dostępna w celu wycinka 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ń dodanych przez wydawcę podrzędnego.

Sortowanie i filtrowanie danych

Za pomocą klasy FIRDatabaseQuery Bazy danych czasu rzeczywistego możesz pobrać dane posortowane według klucza, wartości lub wartości elementu podrzędnego. Możesz też filtrować posortowany wynik według określonej liczby wyników lub zakresu kluczy bądź wartości.

Sortowanie danych

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

Metoda Wykorzystanie
queryOrderedByKey Uporządkuj wyniki według kluczy podrzędnych.
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żywać tylko jednej metody sortowania. Wielokrotne wywołanie metody „order by by” w tym samym zapytaniu powoduje błąd.

Ten przykład pokazuje, jak uzyskać listę najpopularniejszych postów użytkownika, posortowaną według liczby gwiazdek:

Swift

Uwaga: ta usługa Firebase nie jest dostępna w celu wycinka 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 celu wycinka 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ądkowanych według liczby gwiazdek przyznanych poszczególnym postom. Ta technika używania identyfikatorów jako kluczy indeksu jest nazywana rozpowszechnianiem danych. Więcej informacji na ten temat znajdziesz w artykule Uporządkowanie bazy danych.

Wywołanie metody queryOrderedByChild określa klucz podrzędny, według którego należy posortować wyniki. W tym przykładzie posty są sortowane według wartości elementu podrzędnego "starCount" w każdym poście. Zapytania mogą być też porządkowane według zagnieżdżonych elementów podrzędnych, jeśli dane 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 w kluczu 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 celu wycinka aplikacji.
 
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")

Objective-C

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

Więcej informacji o kolejności innych typów danych znajdziesz w sekcji Informacje o kolejności danych w zapytaniach.

Filtrowanie danych

Aby filtrować dane, podczas tworzenia zapytania możesz połączyć dowolne metody limitów lub zakresów z metodą porządkowania.

Metoda Wykorzystanie
queryLimitedToFirst Określa maksymalną liczbę elementów do zwrócenia od początku uporządkowanej listy wyników.
queryLimitedToLast Określa maksymalną liczbę elementów do zwrócenia na końcu uporządkowanej listy wyników.
queryStartingAtValue Zwraca elementy większe lub równe określonemu kluczowi lub wartości w zależności od wybranej metody sortowania.
queryStartingAfterValue Zwraca elementy większe niż określony klucz lub wartość w zależności od wybranej metody sortowania.
queryEndingAtValue Zwraca elementy mniejsze lub równe podanej wartości klucza bądź wartości 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 wartościowi 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 np. łą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żesz ustawić maksymalną liczbę elementów podrzędnych, które mają być synchronizowane w przypadku danego wywołania zwrotnego. Jeśli na przykład użyjesz queryLimitedToFirst, aby ustawić limit 100, początkowo otrzymasz maksymalnie 100 wywołań zwrotnych FIRDataEventTypeChildAdded. Jeśli w bazie danych Firebase masz mniej niż 100 elementów, dla każdego z nich uruchamia się wywołanie zwrotne FIRDataEventTypeChildAdded.

Wraz ze zmianą elementów otrzymujesz wywołania zwrotne FIRDataEventTypeChildAdded dla tych, które wpiszą zapytanie, oraz FIRDataEventTypeChildRemoved wywołań zwrotnych dla elementów, które z nich nie korzystają. Dzięki temu łączna liczba pozostaje na 100.

Ten 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 celu wycinka 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 celu wycinka 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

Za pomocą queryStartingAtValue, queryStartingAfterValue, queryEndingAtValue, queryEndingBeforeValue i queryEqualToValue możesz wybierać dla zapytań dowolny punkt początkowy, końcowy i równoważny. Jest to przydatne przy dzieleniu danych na strony lub znajdowaniu elementów podrzędnych, które mają określoną wartość.

Sposób porządkowania danych zapytań

W tej sekcji wyjaśniamy, jak dane są sortowane według metody w klasie FIRDatabaseQuery.

queryOrderedByKey

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

  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.

queryOrderedByValue

Gdy używasz metody queryOrderedByValue, elementy podrzędne są uporządkowane według wartości. Kryteria sortowania 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

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

  1. Jako pierwsze wyświetlają się elementy podrzędne z wartością nil określonego klucza podrzędnego.
  2. Następne są elementy podrzędne z wartością false określonego klucza podrzędnego. Jeśli kilka elementów podrzędnych ma wartość false, są one sortowane leksykograficznie według klucza.
  3. Następne są elementy podrzędne z wartością true określonego klucza podrzędnego. Jeśli kilka elementów podrzędnych ma wartość true, są one sortowane leksykograficznie według klucza.
  4. Następne są elementy podrzędne z wartością liczbową, posortowane w kolejności rosnącej. Jeśli wiele elementów podrzędnych ma tę samą wartość liczbową określonego węzła podrzędnego, są one sortowane według klucza.
  5. Ciągi znaków znajdują się po liczbach i są sortowane leksykograficznie w kolejności rosnącej. Jeśli wiele elementów podrzędnych ma tę samą wartość w określonym węźle podrzędnym, 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łącz detektory

Obserwatorzy nie zatrzymują automatycznie synchronizacji danych, gdy opuścisz ViewController. Jeśli obserwator nie zostanie poprawnie usunięty, będzie nadal synchronizować dane z pamięcią lokalną i zachować wszystkie obiekty zarejestrowane w wyniku zamknięcia modułu obsługi zdarzeń, co może spowodować wycieki pamięci. Gdy obserwator nie jest już potrzebny, usuń go, przekazując powiązaną z nim wartość FIRDatabaseHandle do metody removeObserverWithHandle.

Gdy dodasz blok wywołania zwrotnego do pliku referencyjnego, zwrócony zostanie element FIRDatabaseHandle. Za pomocą tych uchwytów można usunąć blok wywołania zwrotnego.

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

Wywołanie removeObserverWithHandle lub removeAllObservers w detektorze nie powoduje automatycznego usunięcia detektorów zarejestrowanych w węzłach podrzędnych. Musisz też śledzić te odniesienia lub nicki, aby je usunąć.

Następne kroki