Pobieranie odniesienia do bazy danych FIRDatabase
Aby móc odczytywać lub zapisywać dane z bazy danych, musisz mieć instancję
FIRDatabaseReference
:
Swift
var ref: DatabaseReference! ref = Database.database().reference()
Objective-C
@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
// 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
// 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
_commentsRef.observe(.value) { snapshot in for child in snapshot.children { ... } }
Objective-C
[_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
// My top posts by number of stars let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")
Objective-C
// 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
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")
Objective-C
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
// 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
// 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.
- 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.
- 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:
- Elementy podrzędne z wartością
nil
określonego klucza podrzędnego są dostarczane . - 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. - 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. - 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.
- 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.
- 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ąć.