Arbeiten Sie mit Datenlisten auf Apple-Plattformen

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

Holen Sie sich eine FIRDatabaseReference

Um Daten aus der Datenbank zu lesen oder zu schreiben, benötigen Sie eine Instanz von FIRDatabaseReference :

Schnell

Hinweis: Dieses Firebase-Produkt ist auf dem App Clip-Ziel nicht verfügbar.
var ref: DatabaseReference!

ref = Database.database().reference()

Ziel c

Hinweis: Dieses Firebase-Produkt ist auf dem App Clip-Ziel nicht verfügbar.
@property (strong, nonatomic) FIRDatabaseReference *ref;

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

Listen lesen und schreiben

An eine Datenliste anhängen

Verwenden Sie die Methode childByAutoId , um Daten an eine Liste in Mehrbenutzeranwendungen anzuhängen. Die Methode childByAutoId generiert jedes Mal einen eindeutigen Schlüssel, wenn der angegebenen Firebase-Referenz ein neues untergeordnetes Element hinzugefügt wird. Durch die Verwendung dieser automatisch generierten Schlüssel für jedes neue Element in der Liste können mehrere Clients gleichzeitig Kinder an derselben Stelle hinzufügen, ohne dass es zu Schreibkonflikten kommt. Der von childByAutoId generierte eindeutige Schlüssel basiert auf einem Zeitstempel, sodass Listenelemente automatisch chronologisch geordnet werden.

Sie können den Verweis auf die neuen Daten verwenden, die von der childByAutoId Methode zurückgegeben werden, um den Wert des automatisch generierten Schlüssels des untergeordneten Elements abzurufen oder Daten für das untergeordnete Element festzulegen. Der Aufruf von getKey für eine childByAutoId Referenz gibt den automatisch generierten Schlüssel zurück.

Sie können diese automatisch generierten Schlüssel verwenden, um das Vereinfachen Ihrer Datenstruktur zu vereinfachen. Weitere Informationen finden Sie im Datenauffächerungsbeispiel .

Achten Sie auf untergeordnete Ereignisse

Untergeordnete Ereignisse werden als Reaktion auf bestimmte Vorgänge ausgelöst, die mit den untergeordneten Elementen eines Knotens von einem Vorgang ausgeführt werden, z. B. ein neues untergeordnetes Element, das über die childByAutoId Methode hinzugefügt wird, oder ein untergeordnetes Element, das über die updateChildValues Methode aktualisiert wird.

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 untergeordnete Element ausgelöst und dann erneut jedes Mal, wenn dem angegebenen Pfad ein neues untergeordnetes Element hinzugefügt wird. Dem Zuhörer wird ein Snapshot mit den Daten des neuen Kindes übergeben.
FIRDataEventTypeChildChanged Überwachen Sie Ä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 Listen Sie auf Elemente, die aus einer Liste entfernt werden. Dieses Ereignis wird ausgelöst, wenn ein unmittelbar untergeordnetes Element entfernt wird. Der an den Callback-Block übergebene Snapshot enthält die Daten für das entfernte untergeordnete Element.
FIRDataEventTypeChildMoved Überwachen Sie Ä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 nach queryOrderedByChild oder queryOrderedByValue geordnet sind.

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

Schnell

Hinweis: Dieses Firebase-Produkt ist auf dem App Clip-Ziel nicht verfügbar.
// 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

Hinweis: Dieses Firebase-Produkt ist auf dem App Clip-Ziel nicht verfügbar.
// 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];
 }];

Achten Sie auf Wertereignisse

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.

Wenn Sie einen FIRDataEventTypeValue Beobachter an eine Datenliste anfügen, wird die gesamte Datenliste als einzelner DataSnapshot zurückgegeben, den Sie dann durchlaufen können, um auf einzelne untergeordnete Elemente zuzugreifen.

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

Schnell

Hinweis: Dieses Firebase-Produkt ist auf dem App Clip-Ziel nicht verfügbar.
_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

Ziel c

Hinweis: Dieses Firebase-Produkt ist auf dem App Clip-Ziel nicht verfügbar.
[_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 FIRDatabaseQuery Klasse der Echtzeitdatenbank verwenden, um Daten abzurufen, die nach Schlüssel, nach Wert oder nach dem Wert eines untergeordneten Elements sortiert sind. 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 Verwendung
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 jeweils nur eine Order-by-Methode verwenden. Das mehrmalige Aufrufen einer Order-By-Methode in derselben Abfrage löst einen Fehler aus.

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

Schnell

Hinweis: Dieses Firebase-Produkt ist auf dem App Clip-Ziel nicht verfügbar.
// My top posts by number of stars
let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")

Ziel c

Hinweis: Dieses Firebase-Produkt ist auf dem App Clip-Ziel nicht verfügbar.
// My top posts by number of stars
FIRDatabaseQuery *myTopPostsQuery = [[[self.ref child:@"user-posts"]
                                      child:[super getUid]]
                                     queryOrderedByChild:@"starCount"];

Diese Abfrage ruft die Posts des Benutzers aus dem Pfad in der Datenbank basierend auf seiner Benutzer-ID ab, sortiert nach der Anzahl der Sterne, die jeder Post erhalten hat. Diese Technik der Verwendung von IDs als Indexschlüssel wird als Datenauffächerung bezeichnet. Sie können mehr darüber in Structure Your Database lesen.

Der Aufruf der Methode queryOrderedByChild gibt den untergeordneten Schlüssel an, nach dem die Ergebnisse sortiert werden sollen. In diesem Beispiel werden Beiträge nach dem Wert des untergeordneten Elements "starCount" in jedem Beitrag sortiert. Abfragen können auch nach verschachtelten untergeordneten Elementen 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 nach Werten sortieren, die unter dem metrics verschachtelt sind, indem wir den relativen Pfad zum verschachtelten untergeordneten Element in unserem queryOrderedByChild Aufruf angeben.

Schnell

Hinweis: Dieses Firebase-Produkt ist auf dem App Clip-Ziel nicht verfügbar.
 
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")

Ziel c

Hinweis: Dieses Firebase-Produkt ist auf dem App Clip-Ziel nicht verfügbar.
 
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];

Weitere Informationen zur Sortierung anderer Datentypen finden Sie unter Sortierung von Abfragedaten .

Filtern von Daten

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

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

Im Gegensatz zu den Order-by-Methoden können Sie mehrere Limit- oder Bereichsfunktionen kombinieren. Beispielsweise können Sie die Methoden queryStartingAtValue und queryEndingAtValue kombinieren, um die Ergebnisse auf einen bestimmten Wertebereich zu beschränken.

Begrenzen Sie die Anzahl der Ergebnisse

Sie können die Methoden queryLimitedToFirst und queryLimitedToLast verwenden, um eine maximale Anzahl untergeordneter Elemente festzulegen, die für einen bestimmten Rückruf synchronisiert werden sollen. Wenn Sie beispielsweise queryLimitedToFirst verwenden, um ein Limit von 100 festzulegen, erhalten Sie zunächst nur bis zu 100 FIRDataEventTypeChildAdded Callbacks. Wenn Sie weniger als 100 Elemente in Ihrer Firebase-Datenbank gespeichert haben, wird für jedes Element ein FIRDataEventTypeChildAdded Callback ausgelöst.

Wenn sich Elemente ändern, erhalten Sie FIRDataEventTypeChildAdded Callbacks für Elemente, die in die Abfrage aufgenommen werden, und FIRDataEventTypeChildRemoved -Callbacks für Elemente, die daraus herausfallen, sodass die Gesamtzahl bei 100 bleibt.

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

Schnell

Hinweis: Dieses Firebase-Produkt ist auf dem App Clip-Ziel nicht verfügbar.
// 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

Hinweis: Dieses Firebase-Produkt ist auf dem App Clip-Ziel nicht verfügbar.
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
FIRDatabaseQuery *recentPostsQuery = [[self.ref child:@"posts"] queryLimitedToFirst:100];

Filtern Sie nach Schlüssel oder Wert

Sie können queryStartingAtValue , queryStartingAfterValue , queryEndingAtValue , queryEndingBeforeValue und queryEqualToValue verwenden, um beliebige Start-, End- und Äquivalenzpunkte für Abfragen auszuwählen. Dies kann nützlich sein, um Daten zu paginieren oder Elemente mit untergeordneten Elementen zu finden, die einen bestimmten Wert haben.

Wie Abfragedaten geordnet werden

In diesem Abschnitt wird erläutert, wie Daten von den einzelnen Sortiermethoden in der FIRDatabaseQuery Klasse sortiert werden.

queryOrderedByKey

Wenn Sie queryOrderedByKey zum Sortieren Ihrer Daten verwenden, werden die Daten in aufsteigender Reihenfolge nach Schlüssel zurückgegeben.

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

queryOrderedByValue

Bei Verwendung von queryOrderedByValue werden untergeordnete Elemente nach ihrem Wert sortiert. Die Sortierkriterien sind dieselben wie in queryOrderedByChild , außer dass der Wert des Knotens anstelle des Werts eines angegebenen untergeordneten Schlüssels verwendet wird.

queryOrderedByChild

Bei Verwendung von queryOrderedByChild werden Daten, die den angegebenen untergeordneten Schlüssel enthalten, wie folgt geordnet:

  1. Kinder mit einem nil für den angegebenen untergeordneten Schlüssel kommen zuerst.
  2. Als nächstes kommen Kinder mit dem Wert false für den angegebenen untergeordneten Schlüssel. Wenn mehrere Kinder den Wert false haben, werden sie lexikografisch nach Schlüssel sortiert.
  3. Als nächstes kommen Kinder mit dem Wert true für den angegebenen untergeordneten Schlüssel. Wenn mehrere Kinder den Wert true haben, werden sie lexikografisch nach Schlüssel sortiert.
  4. Kinder mit einem numerischen Wert kommen als nächstes, in aufsteigender Reihenfolge sortiert. Wenn mehrere untergeordnete Knoten denselben numerischen Wert für den angegebenen untergeordneten Knoten haben, werden sie nach Schlüssel sortiert.
  5. Zeichenfolgen kommen nach Zahlen und werden lexikographisch in aufsteigender Reihenfolge sortiert. Wenn mehrere untergeordnete Knoten denselben Wert für den angegebenen untergeordneten Knoten haben, werden sie lexikografisch nach Schlüssel geordnet.
  6. Die Objekte kommen zuletzt und werden lexikografisch nach Schlüsseln in aufsteigender Reihenfolge sortiert.

Zuhörer trennen

Beobachter hören nicht automatisch auf, Daten zu synchronisieren, wenn Sie einen ViewController verlassen. Wenn ein Beobachter nicht ordnungsgemäß entfernt wird, synchronisiert er weiterhin Daten mit dem lokalen Speicher und behält alle Objekte bei, die beim Schließen des Ereignishandlers erfasst wurden, was zu Speicherverlusten führen kann. Wenn ein Beobachter nicht mehr benötigt wird, entfernen Sie ihn, indem Sie das zugeordnete FIRDatabaseHandle an die Methode removeObserverWithHandle übergeben.

Wenn Sie einem Verweis einen Rückrufblock hinzufügen, wird ein FIRDatabaseHandle zurückgegeben. Diese Handles können verwendet werden, um die Callback-Sperre zu entfernen.

Wenn einer Datenbankreferenz mehrere Listener hinzugefügt wurden, wird jeder Listener aufgerufen, wenn ein Ereignis ausgelöst wird. Um die Synchronisierung von Daten an diesem Standort zu beenden, müssen Sie alle Beobachter an einem Standort entfernen, indem Sie die Methode removeAllObservers aufrufen.

Das Aufrufen von removeObserverWithHandle oder removeAllObservers auf einem Listener entfernt nicht automatisch Listener, die auf seinen untergeordneten Knoten registriert sind; Sie müssen auch diese Verweise oder Handles verfolgen, um sie zu entfernen.

Nächste Schritte