Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Arbeiten mit Datenlisten auf Apple-Plattformen

Holen Sie sich eine FIRDatenbank-Referenz

Zum Lesen oder Schreiben von Daten aus der Datenbank, müssen Sie eine Instanz von FIRDatabaseReference :

Schnell

var ref: DatabaseReference!

ref = Database.database().reference()

Ziel c

@property (strong, nonatomic) FIRDatabaseReference *ref;

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

Listen lesen und schreiben

An eine Datenliste anhängen

Verwenden Sie die childByAutoId Methode , um Daten anhängen zu einer Liste im Multi - User - Anwendungen. Die childByAutoId Methode erzeugt einen eindeutigen Schlüssel jedes Mal , wenn ein neues Kind in der angegebenen Firebase Referenz hinzugefügt wird. Durch die Verwendung dieser automatisch generierten Schlüssel für jedes neue Element in der Liste können mehrere Clients gleichzeitig untergeordnete Elemente ohne Schreibkonflikte am selben Speicherort hinzufügen. Der eindeutige Schlüssel von erzeugt childByAutoId auf einem Zeitstempel basiert, so dass Listenelemente werden automatisch chronologisch geordnet.

Sie können den Verweis auf die neuen Daten , die von dem zurück verwenden childByAutoId Methode den Wert des Kindes automatisch generierten Schlüssel oder eingestellten Daten für das Kind zu bekommen. Der Aufruf getKey auf einer childByAutoId Referenz gibt die automatisch generierten Schlüssel.

Sie können diese automatisch generierten Schlüssel verwenden, um die Reduzierung Ihrer Datenstruktur zu vereinfachen. Weitere Informationen finden Sie in die Daten Fanout Beispiel .

Auf Kinderereignisse achten

Kinderveranstaltungen werden in Reaktion auf bestimmte Vorgänge ausgelöst, die von einer Operation an die Kinder eines Knotens geschehen wie ein neues Kind aufgenommen durch die childByAutoId Verfahren oder ein Kind durch die aktualisiert werden updateChildValues Methode.

Ereignistyp Typische Verwendung
FIRDataEventTypeChildAdded Rufen Sie Listen von Elementen ab oder hören Sie auf Ergänzungen zu einer Liste von Elementen. Dieses Ereignis wird einmal für jedes vorhandene Kind ausgelöst und dann jedes Mal, wenn dem angegebenen Pfad ein neues Kind hinzugefügt wird. Dem Listener wird ein Snapshot übergeben, der die Daten des neuen untergeordneten Elements enthält.
FIRDataEventTypeChildChanged Achten Sie auf Änderungen an den Elementen in einer Liste. Dieses Ereignis wird jedes Mal ausgelöst, wenn ein untergeordneter Knoten geändert wird. Dies schließt alle Änderungen an Nachkommen des untergeordneten Knotens ein. Der an den Ereignis-Listener übergebene Snapshot enthält die aktualisierten Daten für das untergeordnete Element.
FIRDataEventTypeChildRemoved Achten Sie darauf, dass Elemente aus einer Liste entfernt werden. Dieses Ereignis wird ausgelöst, wenn ein unmittelbar untergeordnetes Element entfernt wird. Der an den Rückrufblock übergebene Snapshot enthält die Daten für das entfernte untergeordnete Element.
FIRDataEventTypeChildMoved Achten Sie auf Änderungen an der Reihenfolge der Elemente in einer geordneten Liste. Dieses Ereignis wird immer dann ausgelöst, wenn eine Aktualisierung eine Neuordnung des untergeordneten Elements verursacht. Es wird mit Daten verwendet , die von bestellt wird queryOrderedByChild oder queryOrderedByValue .

Alle zusammen können nützlich sein, um Änderungen an einem bestimmten Knoten in einer Datenbank abzuhören. Beispielsweise kann eine Social-Blogging-App diese Methoden zusammen verwenden, um die Aktivität in den Kommentaren eines Beitrags zu überwachen, wie unten gezeigt:

Schnell

// 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
  )
})

Ziel 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];
 }];

Auf Wertereignisse achten

Während das Abhören von untergeordneten Ereignissen die empfohlene Methode zum Lesen von Datenlisten ist, gibt es Situationen, in denen das Abhören von Wertereignissen in einer Listenreferenz nützlich ist.

Ein Anbringen FIRDataEventTypeValue Beobachter auf eine Liste von Daten wird die gesamte Liste der Daten als eine einzelne DataSnapshot zurückkehren, die Sie dann Schleife über den Zugriff auf einzelne Kinder.

Auch wenn es nur eine einzige Übereinstimmung für die Abfrage gibt, ist der Snapshot immer noch eine Liste; es enthält nur ein einzelnes Element. Um auf das Element zuzugreifen, müssen Sie das Ergebnis durchlaufen:

Schnell

_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

Ziel c

[_commentsRef
              observeEventType:FIRDataEventTypeValue
              withBlock:^(FIRDataSnapshot *snapshot) {
                // Loop over children
                NSEnumerator *children = [snapshot children];
                FIRDataSnapshot *child;
                while (child = [children nextObject]) {
                  // ...
                }
              }];

Dieses Muster kann nützlich sein, wenn Sie alle untergeordneten Elemente einer Liste in einem einzigen Vorgang abrufen möchten, anstatt auf zusätzliche untergeordnete Ereignisse zu warten.

Daten sortieren und filtern

Sie können die Echtzeitdatenbank verwenden FIRDatabaseQuery Klasse , um Daten von Schlüssel sortiert abrufen, nach Wert, oder durch den Wert eines Kindes. Sie können das sortierte Ergebnis auch nach einer bestimmten Anzahl von Ergebnissen oder einem Bereich von Schlüsseln oder Werten filtern.

Daten sortieren

Um sortierte Daten abzurufen, geben Sie zunächst eine der Sortiermethoden an, um zu bestimmen, wie die Ergebnisse sortiert werden:

Methode Verwendungszweck
queryOrderedByKey Sortieren Sie die Ergebnisse nach untergeordneten Schlüsseln.
queryOrderedByValue Sortieren Sie die Ergebnisse nach untergeordneten Werten.
queryOrderedByChild Sortieren Sie die Ergebnisse nach dem Wert eines angegebenen untergeordneten Schlüssels oder verschachtelten untergeordneten Pfads.

Sie können nur zu einem Zeitpunkt eine Order-by - Methode verwenden. Das mehrmalige Aufrufen einer order-by-Methode in derselben Abfrage führt zu einem Fehler.

Das folgende Beispiel zeigt, wie Sie eine Liste der Top-Posts eines Benutzers, sortiert nach der Anzahl der Sterne, abrufen können:

Schnell

// My top posts by number of stars
let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")

Ziel c

// My top posts by number of stars
FIRDatabaseQuery *myTopPostsQuery = [[[self.ref child:@"user-posts"]
                                      child:[super getUid]]
                                     queryOrderedByChild:@"starCount"];

Diese Abfrage ruft die Beiträge des Benutzers aus dem Pfad in der Datenbank basierend auf seiner Benutzer-ID ab, geordnet nach der Anzahl der Sterne, die jeder Beitrag erhalten hat. Diese Technik der IDs als Indexschlüssel verwendet wird , um Daten auffächern genannt, können Sie mehr darüber in lesen Struktur Ihrer Datenbank .

Der Aufruf der queryOrderedByChild Methode gibt das Kind Schlüssel , um die Ergebnisse zu bestellen durch. In diesem Beispiel werden Beiträge durch den Wert des sortierten "starCount" Kindes in jedem Beitrag. Abfragen können auch nach verschachtelten Kindern geordnet werden, falls Sie Daten haben, die wie folgt aussehen:

"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",
  }
},

In diesem Fall können wir unsere Listenelemente durch Werte verschachtelt unter der Bestellnummer metrics Schlüssel durch den relativen Pfad zu dem verschachtelten Kind in unserer Angabe queryOrderedByChild Anruf.

Schnell

 
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")

Ziel c

 
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];

Weitere Informationen darüber , wie andere Datentypen bestellt werden, siehe Wie Abfragedaten bestellt wird .

Daten filtern

Um Daten zu filtern, können Sie beim Erstellen einer Abfrage jede der Limit- oder Range-Methoden mit einer order-by-Methode kombinieren.

Methode Verwendungszweck
queryLimitedToFirst Legt die maximale Anzahl von Elementen fest, die vom Anfang der geordneten Ergebnisliste zurückgegeben werden sollen.
queryLimitedToLast Legt die maximale Anzahl von Elementen fest, die vom Ende der geordneten Ergebnisliste zurückgegeben werden.
queryStartingAtValue Gibt Elemente zurück, die größer oder gleich dem angegebenen Schlüssel oder Wert sind, abhängig von der ausgewählten Sortiermethode.
queryStartingAfterValue Gibt Elemente zurück, die größer als der angegebene Schlüssel oder Wert sind, abhängig von der ausgewählten Sortiermethode.
queryEndingAtValue Geben Sie Elemente zurück, die kleiner oder gleich dem angegebenen Schlüssel oder Wert sind, abhängig von der ausgewählten Sortiermethode.
queryEndingBeforeValue Geben Sie Elemente zurück, die weniger als den angegebenen Schlüssel oder Wert aufweisen, je nach gewählter Sortiermethode.
queryEqualToValue Geben Sie Elemente zurück, die dem angegebenen Schlüssel oder Wert entsprechen, abhängig von der ausgewählten Sortiermethode.

Im Gegensatz zu den Sortiermethoden können Sie mehrere Grenzwert- oder Bereichsfunktionen kombinieren. Zum Beispiel können Sie die kombinieren queryStartingAtValue und queryEndingAtValue Methoden , um die Ergebnisse auf einen bestimmten Bereich von Werten zu begrenzen.

Begrenzen Sie die Anzahl der Ergebnisse

Sie können die Verwendung queryLimitedToFirst und queryLimitedToLast Methoden , um eine maximale Anzahl von Kindern setzen für einen bestimmten Rückruf synchronisiert werden. Wenn Sie zum Beispiel verwenden queryLimitedToFirst eine Grenze von 100 zu setzen, Sie zunächst erhalten nur auf 100 bis FIRDataEventTypeChildAdded Rückrufe. Wenn Sie weniger als 100 in Ihrer Firebase Datenbank gespeicherten Elemente, ein FIRDataEventTypeChildAdded Rückruf Feuer für jedes Element.

Als Elemente ändern, erhalten Sie FIRDataEventTypeChildAdded Rückrufe für Elemente , die die Abfrage und geben Sie FIRDataEventTypeChildRemoved Rückrufe für Gegenstände , die so davon fallen aus , dass die Gesamtzahl bleibt bei 100.

Das folgende Beispiel zeigt, wie eine Beispiel-Blogging-App eine Liste der 100 neuesten Beiträge aller Benutzer abrufen könnte:

Schnell

// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
let recentPostsQuery = (ref?.child("posts").queryLimited(toFirst: 100))!

Ziel 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];

Nach Schlüssel oder Wert filtern

Sie können mit queryStartingAtValue , queryStartingAfterValue , queryEndingAtValue , queryEndingBeforeValue und queryEqualToValue beliebigen Start wählen, am Ende, und Equivalenzpunkte für Abfragen. Dies kann nützlich sein, um Daten zu paginieren oder Elemente mit untergeordneten Elementen zu finden, die einen bestimmten Wert haben.

So werden Abfragedaten geordnet

In diesem Abschnitt wird beschrieben , wie Daten , die von jedem des auftrags durch Verfahren in der sortiert werden FIRDatabaseQuery Klasse.

queryOrderedByKey

Bei der Verwendung von queryOrderedByKey Ihre Daten zu sortieren, werden die Daten zurückgegeben , um durch Schlüssel in steigend.

  1. Kinder mit einem Schlüssel, der als 32-Bit-Ganzzahl geparst werden kann, kommen zuerst, sortiert in aufsteigender Reihenfolge.
  2. Als nächstes kommen Kinder mit einem String-Wert als Schlüssel, lexikographisch aufsteigend sortiert.

queryOrderedByValue

Bei der Verwendung von queryOrderedByValue werden die Kinder von ihrem Wert bestellt. Die Ordnungskriterien sind die gleichen wie in queryOrderedByChild , außer der Wert des Knotens anstelle des Wertes eines bestimmten untergeordneten Schlüssel verwendet wird.

queryOrderedByChild

Bei der Verwendung von queryOrderedByChild , Daten , die der angegebene untergeordnete Schlüssel enthält bestellt wird , wie folgt:

  1. Kinder mit einem nil - Wert für den angegebenen Kind Schlüssel an erster Stelle .
  2. Kinder mit einem Wert von false für den angegebenen Kind Schlüssel als nächstes kommen. Wenn mehrere Kinder einen Wert von false , werden sie sortiert lexikographisch durch Schlüssel.
  3. Kinder mit einem Wert von true für den angegebenen Kind Schlüssel als nächstes kommen. Wenn mehrere Kinder einen Wert von true , sie sind lexikographisch nach Schlüssel sortiert.
  4. Als nächstes folgen Kinder mit einem numerischen Wert, sortiert in aufsteigender Reihenfolge. Wenn mehrere untergeordnete Knoten denselben numerischen Wert für den angegebenen untergeordneten Knoten haben, werden sie nach dem Schlüssel sortiert.
  5. Strings kommen nach Zahlen und werden lexikographisch aufsteigend sortiert. Wenn mehrere Kinder denselben Wert für den angegebenen Kindknoten haben, werden sie lexikografisch nach Schlüssel sortiert.
  6. Objekte stehen an letzter Stelle und werden lexikographisch nach Schlüsseln in aufsteigender Reihenfolge sortiert.

Hörer trennen

Beobachter nicht stoppen Daten automatisch synchronisieren , wenn Sie einen verlassen ViewController . Wenn ein Beobachter nicht ordnungsgemäß entfernt wird, synchronisiert er weiterhin Daten mit dem lokalen Speicher und behält alle beim Schließen des Ereignishandlers erfassten Objekte bei, was zu Speicherverlusten führen kann. Wenn ein Beobachter nicht mehr benötigt wird , entfernen , indem es das zugeordnete vorbei FIRDatabaseHandle zur removeObserverWithHandle Methode.

Wenn Sie einen Rückruf Block zu einer Referenz hinzufügen, ein FIRDatabaseHandle zurückgegeben. Diese Handles können verwendet werden, um den Callback-Block zu entfernen.

Wenn einer Datenbankreferenz mehrere Listener hinzugefügt wurden, wird jeder Listener aufgerufen, wenn ein Ereignis ausgelöst wird. Um an dieser Stelle der Synchronisierung von Daten zu stoppen, müssen Sie alle Beobachter an einem Ort entfernen , indem das Aufruf removeAllObservers Methode.

Der Aufruf removeObserverWithHandle oder removeAllObservers auf einem Zuhörer nicht automatisch Hörer entfernen auf seinen untergeordneten Knoten registriert ist ; Sie müssen auch diese Referenzen oder Handles verfolgen, um sie zu entfernen.

Nächste Schritte