Korzystanie z list danych na platformach Apple

Pobieranie odniesienia do bazy danych FIRDatabase

Aby móc odczytywać lub zapisywać dane z bazy danych, musisz mieć instancję FIRDatabaseReference:

Swift

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

ref = Database.database().reference()

Objective-C

Uwaga: ta usługa Firebase nie jest dostępna w miejscu docelowym 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 przypadku wielu użytkowników aplikacji. Metoda childByAutoId generuje unikalny klucz przy każdym nowym kluczu element podrzędny został dodany do określonego odwołania Firebase. Za pomocą tych generowanych automatycznie kluczy dla każdego nowego elementu na liście, niektórzy klienci mogą dodawać dzieci w tej samej lokalizacji w tym samym czasie, bez konfliktów zapisu. unikalny klucz generowany przez aplikację 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 pobrać wartość automatycznie wygenerowanego klucza wydawcy podrzędnego lub ustawić dane dla niego. Wywołanie getKey w pliku referencyjnym childByAutoId zwraca klucz wygenerowany automatycznie.

Możesz użyć tych automatycznie wygenerowanych kluczy, aby uprościć udostępnianie danych do jego struktury. Więcej informacji znajdziesz w opisie rozpowszechniania danych przykład.

Nasłuchuj zdarzeń podrzędnych

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 childByAutoId lub element podrzędny aktualizowany za pomocą Metoda 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 potem ponownie za każdym razem, gdy do określonej ścieżki jest dodawany nowy element podrzędny. Słuchacz przesłał zrzut dysku zawierający dane nowego wydawcy 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 potomnych węzła podrzędnego. Zrzut przekazany do detektora zdarzeń zawiera zaktualizowane dane elementu podrzędnego.
FIRDataEventTypeChildRemoved Nasłuchuj elementów usuwanych z listy. To zdarzenie jest wyzwalane, gdy: Zostanie usunięte natychmiastowe element podrzędny.Zrzut przekazywany 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 wyzwalane za każdym razem, gdy aktualizacja powoduje zmianę kolejności dziecka. Jest używany z danymi uporządkowanymi według queryOrderedByChild lub queryOrderedByValue.

Każda z tych opcji może być przydatna do monitorowania zmian w konkretnych w bazie danych. Na przykład aplikacja do obsługi blogów społecznościowych może wykorzystywać te metody aby monitorować aktywność w komentarzach do posta, na przykład:

Swift

Uwaga: ta usługa Firebase nie jest dostępna w miejscu docelowym 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 miejscu docelowym 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

Podczas nasłuchiwania zdarzeń podrzędnych to zalecany sposób odczytywania list danych, są sytuacje, w których nasłuchiwanie zdarzeń wartości w odniesieniu do listy jest przydatne.

Dołączenie obserwatora FIRDataEventTypeValue do listy danych spowoduje zwrócenie całą listę danych w postaci pojedynczego zrzutu DataSnapshot, który można następnie ponownie wyświetlać dostępu do poszczególnych dzieci.

Nawet jeśli dla zapytania znaleziono tylko jedno dopasowanie, zrzut nadal jest lista; zawiera tylko jeden element. Aby uzyskać dostęp do elementu, musisz utworzyć pętlę w stosunku do wyniku:

Swift

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

Objective-C

Uwaga: ta usługa Firebase nie jest dostępna w miejscu docelowym 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ć dodanych wydawców podrzędnych. zdarzeń.

Sortowanie i filtrowanie danych

Do pobrania posortowanych danych możesz użyć klasy Realtime Database FIRDatabaseQuery 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
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. Wywoływanie kolejności według metody które kilka razy wywoła to samo zapytanie, spowoduje zgłoszenie błędu.

Poniższy przykład pokazuje, jak można pobrać listę danych użytkownika najpopularniejsze posty posortowane według liczby gwiazdek:

Swift

Uwaga: ta usługa Firebase nie jest dostępna w miejscu docelowym 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 miejscu docelowym 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: swojego identyfikatora użytkownika, uporządkowanych według liczby gwiazdek przyznanych poszczególnym postom. Ten używania identyfikatorów jako kluczy indeksu nazywamy rozpowszechnianiem danych, więcej na ten temat znajdziesz w Utwórz strukturę bazy danych.

Wywołanie metody queryOrderedByChild określa klucz podrzędny, który ma być ułożony wyniki. W tym przykładzie posty są sortowane według wartości atrybutu "starCount" dziecko w każdym poście. Zapytania mogą być też porządkowane według zagnieżdżonych dzieci, w przypadku gdy masz dane podobne do tych:

"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 metrics, określając ścieżkę względną do zagnieżdżonego elementu podrzędnego w naszym queryOrderedByChild połączenie.

Swift

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

Objective-C

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

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
queryLimitedToFirst Określa maksymalną liczbę elementów do zwrócenia od początku wartości uporządkowana lista wyników.
queryLimitedToLast Określa maksymalną liczbę produktów do zwrócenia od końca zamówionego produktu z listą wyników.
queryStartingAtValue Zwraca elementy większe lub równe określonemu kluczowi lub wartościowi, 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 określonemu kluczowi lub wartościowi, 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ści, w zależności od tego, według 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 queryStartingAtValue i queryEndingAtValue, aby ograniczyć wyniki do określonego zakresu wartości.

Ogranicz liczbę wyników

Możesz użyć metod queryLimitedToFirst i queryLimitedToLast, aby ustawić maksymalna liczba dzieci do zsynchronizowania w przypadku danego wywołania zwrotnego. Na przykład, jeśli używasz aplikacji queryLimitedToFirst, aby ustawić limit wynoszący 100, początkowo otrzymasz tylko do 100 wywołań zwrotnych FIRDataEventTypeChildAdded. Jeśli na bazy danych Firebase, dla każdego elementu uruchamia się wywołanie zwrotne FIRDataEventTypeChildAdded.

W miarę zmiany elementów otrzymujesz FIRDataEventTypeChildAdded wywołań zwrotnych dla elementów, które zostały wprowadzone oraz wywołania zwrotne FIRDataEventTypeChildRemoved dla elementów, które z niego opuszczają, tak aby łączna liczba pozostaje na poziomie 100.

Ten przykład pokazuje, jak przykładowa aplikacja do tworzenia blogów może pobrać lista 100 najnowszych postów wszystkich użytkowników:

Swift

Uwaga: ta usługa Firebase nie jest dostępna w miejscu docelowym 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 miejscu docelowym 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

Możesz używać tych metod: queryStartingAtValue, queryStartingAfterValue, queryEndingAtValue, queryEndingBeforeValue i queryEqualToValue który umożliwia wybór dowolnego punktu początkowego, końcowego i równoważnego dla zapytań. Ten przydaje się do dzielenia danych na strony lub znajdowania elementów z dziećmi, które dla konkretnej wartości.

Sposób porządkowania danych zapytań

W tej sekcji omówiono sposób sortowania danych według poszczególnych metod FIRDatabaseQuery zajęcia.

queryOrderedByKey

Gdy dane są sortowane przy użyciu funkcji queryOrderedByKey, 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.

queryOrderedByValue

Gdy używasz metody queryOrderedByValue, elementy podrzędne są uporządkowane według wartości. Kolejność kryteria są takie same jak w queryOrderedByChild, z wyjątkiem wartości węzła zamiast wartości określonego klucza podrzędnego.

queryOrderedByChild

Gdy używasz queryOrderedByChild, dane zawierające określony klucz podrzędny są w następującej kolejności:

  1. Elementy podrzędne z wartością nil określonego klucza podrzędnego są dostarczane .
  2. Elementy podrzędne z 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 z 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.

Odłącz detektory

Obserwatorzy nie zatrzymują automatycznie synchronizacji danych, gdy opuścisz stronę ViewController Jeśli obserwator nie zostanie prawidłowo usunięty, będzie nadal synchronizować się w pamięci lokalnej i zachowują wszystkie obiekty zarejestrowane przez moduł obsługi zdarzeń może dojść do wycieku pamięci. Gdy obserwator nie jest już potrzebny, możesz go usunąć, przekazując powiązane z nim FIRDatabaseHandle do Metoda 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ływane po wywołaniu zdarzenia. Aby zatrzymać synchronizację danych w tej lokalizacji, musisz usunąć wszystkich obserwatorów w danej lokalizacji, wywołując funkcję removeAllObservers .

Wywoływanie removeObserverWithHandle lub removeAllObservers przez słuchacza nie mogą automatycznie usuwać detektorów zarejestrowanych w węzłach podrzędnych; musisz też śledzić te odniesienia lub nicki i je usunąć.

Następne kroki