Apple platformlarında Veri Listeleriyle çalışma

FIRDatabaseReference'ı edinin

Veritabanından veri okumak veya yazmak için bir FIRDatabaseReference örneğine ihtiyacınız vardır:

Süratli

Not: Bu Firebase ürünü, App Clip hedefinde mevcut değildir.
var ref: DatabaseReference!

ref = Database.database().reference()

Amaç-C

Not: Bu Firebase ürünü, App Clip hedefinde mevcut değildir.
@property (strong, nonatomic) FIRDatabaseReference *ref;

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

Listeleri okuma ve yazma

Veri listesine ekleme

Çok kullanıcılı uygulamalarda verileri bir listeye eklemek için childByAutoId yöntemini kullanın. childByAutoId yöntemi, belirtilen Firebase referansına her yeni alt öğe eklendiğinde benzersiz bir anahtar oluşturur. Listedeki her yeni öğe için otomatik olarak oluşturulan bu anahtarları kullanarak, birkaç istemci, yazma çakışmaları olmadan aynı anda çocukları aynı konuma ekleyebilir. childByAutoId tarafından oluşturulan benzersiz anahtar bir zaman damgasını temel alır, dolayısıyla liste öğeleri otomatik olarak kronolojik olarak sıralanır.

Alt öğenin otomatik olarak oluşturulan anahtarının değerini veya alt öğe için ayarlanan verileri almak için childByAutoId yöntemi tarafından döndürülen yeni verilere yapılan başvuruyu kullanabilirsiniz. childByAutoId referansında getKey çağırmak, otomatik olarak oluşturulan anahtarı döndürür.

Veri yapınızı düzleştirmeyi kolaylaştırmak için otomatik olarak oluşturulan bu anahtarları kullanabilirsiniz. Daha fazla bilgi için veri yayma örneğine bakın.

Alt etkinlikleri dinle

Alt olaylar, childByAutoId yöntemi aracılığıyla eklenen yeni bir alt öğe veya updateChildValues ​​yöntemi aracılığıyla güncellenen bir alt öğe gibi bir işlemden bir düğümün alt öğelerinin başına gelen belirli işlemlere yanıt olarak tetiklenir.

Etkinlik tipi Tipik kullanım
FIRDataEventTypeChildAdded Öğe listelerini alın veya öğe listesine yapılan eklemeleri dinleyin. Bu olay, mevcut her alt öğe için bir kez, ardından belirtilen yola her yeni alt öğe eklendiğinde tekrar tetiklenir. Dinleyiciye yeni çocuğun verilerini içeren bir anlık görüntü iletilir.
FIRDataEventTypeChildChanged Listedeki öğelerde yapılan değişiklikleri dinleyin. Bu olay, bir alt düğüm değiştirildiğinde her zaman tetiklenir. Buna alt düğümün alt öğelerinde yapılan değişiklikler de dahildir. Olay dinleyicisine iletilen anlık görüntü, alt öğeye ilişkin güncelleştirilmiş verileri içerir.
FIRDataEventTypeChildRemoved Listeden kaldırılan öğeleri dinleyin. Bu olay, hemen bir alt öğe kaldırıldığında tetiklenir. Geri çağırma bloğuna iletilen anlık görüntü, kaldırılan alt öğenin verilerini içerir.
FIRDataEventTypeChildMoved Sıralı bir listedeki öğelerin sırasındaki değişiklikleri dinleyin. Bu olay, bir güncelleme alt öğenin yeniden sıralanmasına neden olduğunda tetiklenir. queryOrderedByChild veya queryOrderedByValue tarafından sıralanan verilerle kullanılır.

Bunların her biri bir veritabanındaki belirli bir düğümde yapılan değişiklikleri dinlemek için yararlı olabilir. Örneğin, bir sosyal blog uygulaması, aşağıda gösterildiği gibi bir gönderinin yorumlarındaki etkinliği izlemek için bu yöntemleri birlikte kullanabilir:

Süratli

Not: Bu Firebase ürünü, App Clip hedefinde mevcut değildir.
// 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
  )
})

Amaç-C

Not: Bu Firebase ürünü, App Clip hedefinde mevcut değildir.
// 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];
 }];

Değer olaylarını dinleyin

Veri listelerini okumanın önerilen yolu alt olayları dinlemek olsa da, liste referansındaki değer olaylarını dinlemenin yararlı olabileceği durumlar vardır.

Bir veri listesine bir FIRDataEventTypeValue gözlemcisi eklemek, tüm veri listesini tek bir DataSnapshot olarak döndürecektir; daha sonra bu veriyi tek tek alt öğelere erişmek için döngüleyebilirsiniz.

Sorgu için yalnızca tek bir eşleşme olsa bile anlık görüntü hâlâ bir listedir; yalnızca tek bir öğe içerir. Öğeye erişmek için sonucun üzerinden geçmeniz gerekir:

Süratli

Not: Bu Firebase ürünü, App Clip hedefinde mevcut değildir.
_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

Amaç-C

Not: Bu Firebase ürünü, App Clip hedefinde mevcut değildir.
[_commentsRef
              observeEventType:FIRDataEventTypeValue
              withBlock:^(FIRDataSnapshot *snapshot) {
                // Loop over children
                NSEnumerator *children = [snapshot children];
                FIRDataSnapshot *child;
                while (child = [children nextObject]) {
                  // ...
                }
              }];

Bu model, bir listenin tüm alt öğelerini tek bir işlemle getirmek istediğinizde, ek alt öğe eklenen olayları dinlemek yerine yararlı olabilir.

Verileri sıralama ve filtreleme

Anahtara, değere veya bir alt öğenin değerine göre sıralanmış verileri almak için Gerçek Zamanlı Veritabanı FIRDatabaseQuery sınıfını kullanabilirsiniz. Ayrıca sıralanan sonucu belirli sayıda sonuca veya bir anahtar veya değer aralığına göre filtreleyebilirsiniz.

Verileri sırala

Sıralanmış verileri almak için, sonuçların nasıl sıralanacağını belirlemek üzere sıralama yöntemlerinden birini belirterek başlayın:

Yöntem Kullanım
queryOrderedByKey Sonuçları alt anahtarlara göre sıralayın.
queryOrderedByValue Sonuçları alt değerlere göre sıralayın.
queryOrderedByChild Sonuçları belirtilen alt anahtarın veya iç içe geçmiş alt yolun değerine göre sıralayın.

Aynı anda yalnızca tek bir sipariş yöntemi kullanabilirsiniz. Aynı sorguda bir sıralama yöntemini birden çok kez çağırmak hataya neden olur.

Aşağıdaki örnek, bir kullanıcının yıldız sayısına göre sıralanmış en iyi gönderilerinin listesini nasıl alabileceğinizi gösterir:

Süratli

Not: Bu Firebase ürünü, App Clip hedefinde mevcut değildir.
// My top posts by number of stars
let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")

Amaç-C

Not: Bu Firebase ürünü, App Clip hedefinde mevcut değildir.
// My top posts by number of stars
FIRDatabaseQuery *myTopPostsQuery = [[[self.ref child:@"user-posts"]
                                      child:[super getUid]]
                                     queryOrderedByChild:@"starCount"];

Bu sorgu, kullanıcının gönderilerini veritabanındaki yoldan, kullanıcı kimliklerine göre, her gönderinin aldığı yıldız sayısına göre sıralayarak alır. Kimlikleri dizin anahtarları olarak kullanma tekniğine veri yayma adı verilir; bu konuda daha fazla bilgiyi Veritabanınızı Yapılandırma bölümünde okuyabilirsiniz.

queryOrderedByChild yöntemine yapılan çağrı, sonuçların sıralanacağı alt anahtarı belirtir. Bu örnekte gönderiler, her gönderideki "starCount" alt öğesinin değerine göre sıralanmıştır. Şuna benzer verileriniz olması durumunda, sorgular iç içe geçmiş çocuklara göre de sıralanabilir:

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

Bu durumda, queryOrderedByChild çağrımızda iç içe geçmiş alt öğenin göreceli yolunu belirterek, liste öğelerimizi metrics anahtarının altında yuvalanmış değerlere göre sıralayabiliriz.

Süratli

Not: Bu Firebase ürünü, App Clip hedefinde mevcut değildir.
 
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")

Amaç-C

Not: Bu Firebase ürünü, App Clip hedefinde mevcut değildir.
 
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];

Diğer veri türlerinin nasıl sıralandığı hakkında daha fazla bilgi için bkz . Sorgu verileri nasıl sıralanır ?

Verileri filtreleme

Verileri filtrelemek için, sorgu oluştururken limit veya aralık yöntemlerinden herhangi birini sıralama yöntemiyle birleştirebilirsiniz.

Yöntem Kullanım
queryLimitedToFirst Sıralı sonuç listesinin başından itibaren döndürülecek maksimum öğe sayısını ayarlar.
queryLimitedToLast Sıralı sonuç listesinin sonundan döndürülecek maksimum öğe sayısını ayarlar.
queryStartingAtValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden büyük veya ona eşit olan öğeleri döndürün.
queryStartingAfterValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden daha büyük öğeleri döndürün.
queryEndingAtValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtara veya değere eşit veya ondan küçük öğeleri döndürün.
queryEndingBeforeValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden daha az olan öğeleri döndürün.
queryEqualToValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtara veya değere eşit öğeleri döndürün.

Sıralama yöntemlerinden farklı olarak birden fazla limit veya aralık fonksiyonunu birleştirebilirsiniz. Örneğin, sonuçları belirli bir değer aralığıyla sınırlamak için queryStartingAtValue ve queryEndingAtValue yöntemlerini birleştirebilirsiniz.

Sonuç sayısını sınırlayın

Belirli bir geri arama için senkronize edilecek maksimum alt öğe sayısını ayarlamak için queryLimitedToFirst ve queryLimitedToLast yöntemlerini kullanabilirsiniz. Örneğin, 100'lük bir sınır ayarlamak için queryLimitedToFirst kullanırsanız, başlangıçta yalnızca 100'e kadar FIRDataEventTypeChildAdded geri arama alırsınız. Firebase veritabanınızda depolanan öğe sayısı 100'den azsa her öğe için bir FIRDataEventTypeChildAdded geri çağrısı tetiklenir.

Öğeler değiştikçe, sorguya giren öğeler için FIRDataEventTypeChildAdded geri aramaları ve sorgudan çıkan öğeler için FIRDataEventTypeChildRemoved geri aramaları alırsınız; böylece toplam sayı 100'de kalır.

Aşağıdaki örnek, örnek bir blog uygulamasının tüm kullanıcıların en son 100 gönderisinin listesini nasıl alabileceğini göstermektedir:

Süratli

Not: Bu Firebase ürünü, App Clip hedefinde mevcut değildir.
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
let recentPostsQuery = (ref?.child("posts").queryLimited(toFirst: 100))!

Amaç-C

Not: Bu Firebase ürünü, App Clip hedefinde mevcut değildir.
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
FIRDatabaseQuery *recentPostsQuery = [[self.ref child:@"posts"] queryLimitedToFirst:100];

Anahtar veya değere göre filtrele

Sorgular için isteğe bağlı başlangıç, bitiş ve eşdeğerlik noktaları seçmek amacıyla queryStartingAtValue , queryStartingAfterValue , queryEndingAtValue , queryEndingBeforeValue ve queryEqualToValue kullanabilirsiniz. Bu, verileri sayfalara ayırmak veya belirli bir değere sahip alt öğeler içeren öğeleri bulmak için yararlı olabilir.

Sorgu verileri nasıl sıralanır?

Bu bölümde verilerin FIRDatabaseQuery sınıfındaki sıralama yöntemlerinin her birine göre nasıl sıralandığı açıklanmaktadır.

queryOrderedByKey

Verilerinizi sıralamak için queryOrderedByKey kullanıldığında, veriler anahtara göre artan sırada döndürülür.

  1. 32 bitlik bir tamsayı olarak ayrıştırılabilen anahtarı olan çocuklar, artan düzende sıralanarak önce gelir.
  2. Anahtarları dize değeri olan çocuklar daha sonra sözlükbilimsel olarak artan düzende sıralanır.

queryOrderedByValue

queryOrderedByValue kullanıldığında, çocuklar değerlerine göre sıralanır. Sıralama kriterleri, queryOrderedByChild ile aynıdır; ancak belirtilen alt anahtarın değeri yerine düğümün değeri kullanılır.

queryOrderedByChild

queryOrderedByChild kullanıldığında, belirtilen alt anahtarı içeren veriler şu şekilde sıralanır:

  1. Belirtilen alt anahtar için nil değeri olan çocuklar önce gelir.
  2. Daha sonra belirtilen alt anahtar için false değerine sahip çocuklar gelir. Birden fazla çocuğun false değeri varsa, bunlar sözlüksel olarak anahtara göre sıralanır.
  3. Daha sonra belirtilen alt anahtar için true değeri olan çocuklar gelir. Birden fazla çocuğun true değeri varsa, bunlar sözlüksel olarak anahtara göre sıralanır.
  4. Daha sonra sayısal değeri olan çocuklar artan düzende sıralanarak gelir. Birden fazla alt öğe, belirtilen alt düğüm için aynı sayısal değere sahipse anahtara göre sıralanır.
  5. Dizeler sayılardan sonra gelir ve sözlükbilimsel olarak artan düzende sıralanır. Belirtilen alt düğüm için birden fazla alt öğe aynı değere sahipse, bunlar sözlüksel olarak anahtara göre sıralanır.
  6. Nesneler en sonda gelir ve sözlükbilimsel olarak anahtara göre artan düzende sıralanır.

Dinleyicileri ayırın

ViewController ayrıldığınızda gözlemciler veri senkronizasyonunu otomatik olarak durdurmaz. Bir gözlemci düzgün bir şekilde kaldırılmazsa, verileri yerel bellekle eşitlemeye devam eder ve olay işleyicisinin kapatılmasında yakalanan tüm nesneleri korur; bu da bellek sızıntılarına neden olabilir. Bir gözlemciye artık ihtiyaç duyulmadığında, ilişkili FIRDatabaseHandle removeObserverWithHandle yöntemine ileterek onu kaldırın.

Bir referansa geri çağırma bloğu eklediğinizde, bir FIRDatabaseHandle döndürülür. Bu tanıtıcılar geri arama bloğunu kaldırmak için kullanılabilir.

Bir veritabanı referansına birden fazla dinleyici eklenmişse, bir olay meydana geldiğinde her dinleyici çağrılır. Bu konumdaki verilerin senkronizasyonunu durdurmak için, bir konumdaki tüm gözlemcileri, removeAllObservers yöntemini çağırarak kaldırmalısınız.

Bir dinleyicide removeObserverWithHandle veya removeAllObservers çağırmak, alt düğümlerinde kayıtlı dinleyicileri otomatik olarak kaldırmaz; Ayrıca bunları kaldırmak için bu referansları veya tanıtıcıları da takip etmelisiniz.

Sonraki adımlar