Apple platformlarında Veri Listeleriyle çalışın

FIRDatabaseReference alın

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

Süratli

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

ref = Database.database().reference()

Amaç-C

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

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

Listeleri okuma ve yazma

Veri listesine ekle

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

Çocuğun otomatik olarak oluşturulan anahtarının değerini almak veya çocuk için veri ayarlamak için childByAutoId yöntemi tarafından döndürülen yeni verilere başvuruyu kullanabilirsiniz. Bir childByAutoId başvurusunda getKey çağırmak, otomatik olarak oluşturulan anahtarı döndürür.

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

Çocuk olaylarını dinleyin

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 alt olaylar tetiklenir.

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

Bunların her biri birlikte, 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ü, Uygulama Klip 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ü, Uygulama Klip 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

Alt olayları dinlemek, veri listelerini okumanın önerilen yolu olsa da, bir liste referansındaki değer olaylarını dinlemenin yararlı olduğu durumlar vardır.

Bir FIRDataEventTypeValue gözlemcisini bir veri listesine eklemek, tüm veri listesini tek bir DataSnapshot olarak döndürür ve daha sonra tek tek çocuklara erişmek için döngüye girebilirsiniz.

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

Süratli

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

Amaç-C

Not: Bu Firebase ürünü, Uygulama Klip 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, ek alt eklenen olayları dinlemek yerine, bir listenin tüm alt öğelerini tek bir işlemde almak istediğinizde yararlı olabilir.

Verileri sıralama ve filtreleme

Anahtara, değere veya bir alt öğenin değerine göre sıralanmış verileri almak için Realtime Database FIRDatabaseQuery sınıfını kullanabilirsiniz. Ayrıca, sıralanan sonucu belirli sayıda sonuca veya bir dizi anahtar veya değere göre filtreleyebilirsiniz.

Verileri sırala

Sıralanmış verileri almak için, sonuçların nasıl sıralandığını belirlemek için 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 bir alt anahtarın veya iç içe geçmiş alt yolun değerine göre sıralayın.

Bir seferde yalnızca bir sipariş yöntemi kullanabilirsiniz. Aynı sorguda bir sipariş yönteminin birden çok kez çağrılması bir hata verir.

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

Süratli

Not: Bu Firebase ürünü, Uygulama Klip 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ü, Uygulama Klip 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, her gönderinin aldığı yıldız sayısına göre sıralanmış, kullanıcı kimliğine göre veritabanındaki yoldan kullanıcının gönderilerini alır. ID'leri indeks anahtarları olarak kullanma tekniğine data fan out adı verilir, bununla ilgili daha fazla bilgiyi Veritabanınızı Yapın 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 "starCount" alt öğesinin değerine göre sıralanır. Şuna benzeyen verileriniz varsa, sorgular iç içe geçmiş çocuklar tarafından da sipariş edilebilir:

"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 yuvalanmış alt öğeye göreli yolu belirterek, metrics anahtarının altında yuvalanmış değerlere göre liste öğelerimizi sıralayabiliriz.

Süratli

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

Amaç-C

Not: Bu Firebase ürünü, Uygulama Klip 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, bir sorgu oluştururken sınır veya aralık yöntemlerinden herhangi birini sıralama yöntemiyle birleştirebilirsiniz.

Yöntem kullanım
queryLimitedToFirst Sıralı sonuç listesinin başından 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ğere eşit veya daha büyük öğ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 anahtar veya değere eşit veya daha küçük öğeleri döndürün.
queryEndingBeforeValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden daha az öğeleri iade edin.
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 eşitlenecek maksimum çocuk sayısını ayarlamak için queryLimitedToFirst ve queryLimitedToLast yöntemlerini kullanabilirsiniz. Örneğin, 100'lük bir sınır belirlemek 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 100'den az öğeniz varsa, her öğe için bir FIRDataEventTypeChildAdded geri arama başlatılır.

Öğeler değiştikçe, sorguya giren öğeler için FIRDataEventTypeChildRemoved geri aramaları ve sorgudan ayrılan öğeler için FIRDataEventTypeChildAdded 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 bir listesini nasıl alabileceğini gösterir:

Süratli

Not: Bu Firebase ürünü, Uygulama Klip 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ü, Uygulama Klip 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 için queryStartingAtValue , queryStartingAfterValue , queryEndingAtValue , queryEndingBeforeValue ve queryEqualToValue kullanabilirsiniz. Bu, verileri sayfalandırmak veya belirli bir değere sahip alt öğeleri olan öğeleri bulmak için yararlı olabilir.

Sorgu verileri nasıl sıralanır?

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

queryOrderedByKey

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

  1. 32-bit tamsayı olarak ayrıştırılabilen bir anahtarı olan çocuklar, artan düzende sıralanarak önce gelir.
  2. Anahtar olarak dize değerine sahip çocuklar, sözlükbilimsel olarak artan düzende sıralanır.

queryOrderedByValue

queryOrderedByValue kullanırken, çocuklar değerlerine göre sıralanır. Sıralama ölçütleri, belirtilen bir alt anahtarın değeri yerine düğümün değerinin kullanılması dışında, queryOrderedByChild ile aynıdır.

queryOrderedByChild

queryOrderedByChild kullanılırken, belirtilen alt anahtarı içeren veriler aşağıdaki gibi sıralanır:

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

Dinleyicileri ayır

Bir ViewController ayrıldığınızda, gözlemciler verileri eşitlemeyi otomatik olarak durdurmaz. Bir gözlemci düzgün bir şekilde kaldırılmazsa, verileri yerel belleğe eşitlemeye devam eder ve olay işleyicisinin kapanmasında yakalanan tüm nesneleri saklar ve bu da bellek sızıntılarına neden olabilir. Artık bir gözlemciye ihtiyaç kalmadığında, ilişkili FIRDatabaseHandle removeObserverWithHandle yöntemine geçirerek onu kaldırın.

Bir başvuruya bir geri arama bloğu eklediğinizde, bir FIRDatabaseHandle döndürülür. Bu tutamaçlar, geri arama bloğunu kaldırmak için kullanılabilir.

Bir veritabanı başvurusuna birden çok dinleyici eklendiyse, bir olay oluşturulduğunda her bir dinleyici çağrılır. Bu konumdaki verilerin eşitlenmesini durdurmak için, removeAllObservers yöntemini çağırarak bir konumdaki tüm gözlemcileri kaldırmanız gerekir.

Bir dinleyicide removeObserverWithHandle veya removeAllObservers öğesinin çağrılması, alt düğümlerinde kayıtlı dinleyicileri otomatik olarak kaldırmaz; bunları kaldırmak için bu referansları veya tutamaçları da takip etmelisiniz.

Sonraki adımlar