Apple platformlarında Veri Listeleri ile çalışma

FIRDatabaseReference alma

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

Swift

Not: Bu Firebase ürünü, uygulama klipsi hedefinde kullanılamaz.
var ref: DatabaseReference!

ref = Database.database().reference()

Objective-C

Not: Bu Firebase ürünü, uygulama klipsi hedefinde kullanılamaz.
@property (strong, nonatomic) FIRDatabaseReference *ref;

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

Okuma ve yazma listeleri

Veri listesine ekleme

Ç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 çocuk eklendiğinde benzersiz bir anahtar oluşturur. Listedeki her yeni öğe için bu otomatik olarak oluşturulan anahtarları kullanarak birden fazla istemci, yazma çakışması olmadan aynı anda aynı konuma alt öğe ekleyebilir. childByAutoId tarafından oluşturulan benzersiz anahtar, bir zaman damgasına dayanır. Bu nedenle liste öğeleri otomatik olarak kronolojik olarak sıralanır.

Alt öğenin otomatik olarak oluşturulan anahtarının değerini almak veya alt öğe için veri ayarlamak üzere childByAutoId yöntemi tarafından döndürülen yeni verilere referans verebilirsiniz. childByAutoId referansında getKey çağrısı yapıldığında otomatik olarak oluşturulan anahtar döndürülür.

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

Alt etkinlikleri dinleme

Alt öğe etkinlikleri, bir işlemden kaynaklanan belirli işlemlere (ör. childByAutoId yöntemi aracılığıyla eklenen yeni bir alt öğe veya updateChildValues yöntemi aracılığıyla güncellenen bir alt öğe) yanıt olarak tetiklenir.

Etkinlik türü Tipik kullanım
FIRDataEventTypeChildAdded Öğe listelerini alın veya öğe listesine eklenen öğeleri dinleyin. Bu etkinlik, mevcut her alt öğe için bir kez ve ardından belirtilen yola her yeni alt öğe eklendiğinde tekrar tetiklenir. Dinleyiciye, yeni alt öğenin verilerini içeren bir anlık görüntü iletilir.
FIRDataEventTypeChildChanged Listedeki öğelerde yapılan değişiklikleri dinleme Bu etkinlik, bir alt düğüm değiştirildiğinde tetiklenir. Buna, alt öğelerin torunlarında yapılan tüm değişiklikler de dahildir. Etkinlik dinleyicisine iletilen anlık görüntü, alt öğeyle ilgili güncellenmiş verileri içerir.
FIRDataEventTypeChildRemoved Bir listeden öğelerin kaldırılmasını dinleyin. Bu etkinlik, doğrudan 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ıyla ilgili değişiklikleri dinleyin. Bu etkinlik, 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ı, bir yayındaki yorumlardaki etkinliği izlemek için aşağıdaki gibi bu yöntemleri birlikte kullanabilir:

Swift

Not: Bu Firebase ürünü, uygulama klipsi hedefinde kullanılamaz.
// 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

Not: Bu Firebase ürünü, uygulama klipsi hedefinde kullanılamaz.
// 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 etkinliklerini dinleme

Veri listelerini okumanın önerilen yolu alt etkinlikleri dinlemek olsa da liste referansında değer etkinliklerini dinlemenin yararlı olduğu durumlar vardır.

Bir veri listesine FIRDataEventTypeValue gözlemci eklediğinizde, veri listesinin tamamı tek bir DataSnapshot olarak döndürülür. Ardından, tek tek alt öğelere erişmek için bu veri kümesini döngü içinde kullanabilirsiniz.

Sorgu için yalnızca tek bir eşleşme olsa bile anlık görüntü bir liste olmaya devam eder. Yalnızca tek bir öğe içerir. Öğeye erişmek için sonucu döngü içinde incelemeniz gerekir:

Swift

Not: Bu Firebase ürünü, uygulama klipsi hedefinde kullanılamaz.
_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

Objective-C

Not: Bu Firebase ürünü, uygulama klipsi hedefinde kullanılamaz.
[_commentsRef
              observeEventType:FIRDataEventTypeValue
              withBlock:^(FIRDataSnapshot *snapshot) {
                // Loop over children
                NSEnumerator *children = [snapshot children];
                FIRDataSnapshot *child;
                while (child = [children nextObject]) {
                  // ...
                }
              }];

Bu kalıp, ek alt öğe eklenme etkinliklerini 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. Sıralı sonucu belirli bir sonuç sayısına veya anahtar ya da değer aralığına göre de filtreleyebilirsiniz.

Verileri sıralama

Sıralı verileri almak için sonuçların nasıl sıralandığı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 öğe değerlerine göre sıralayın.
queryOrderedByChild Sonuçları, belirtilen bir alt anahtarın veya iç içe yerleştirilmiş alt yolun değerine göre sıralayın.

Aynı anda yalnızca bir sıralama yöntemi kullanabilirsiniz. Sıralama yönteminin aynı sorgu içinde birden çok kez çağrılması hata verir.

Aşağıdaki örnekte, bir kullanıcının yıldız sayısına göre sıralanmış en popüler gönderilerinin listesini nasıl alabileceğiniz gösterilmektedir:

Swift

Not: Bu Firebase ürünü, uygulama klipsi hedefinde kullanılamaz.
// My top posts by number of stars
let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")

Objective-C

Not: Bu Firebase ürünü, uygulama klipsi hedefinde kullanılamaz.
// 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 yayınlarını veritabanındaki yoldan kullanıcı kimliklerine göre alır ve her yayının aldığı yıldız sayısına göre sıralar. Kimlikleri dizin anahtarı olarak kullanma tekniğine veri dağıtımı denir. Bu konu hakkında daha fazla bilgiyi Veritabanınızı Yapılandırma başlıklı makalede bulabilirsiniz.

queryOrderedByChild yönteminin çağrısı, sonuçların sıralanması için alt anahtarı belirtir. Bu örnekte, gönderiler her gönderideki "starCount" alt öğesinin değerine göre sıralanır. Sorgular, aşağıdaki gibi verilere sahip olmanız durumunda iç içe yerleştirilmiş alt öğelere 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 yerleştirilmiş alt öğenin göreli yolunu belirterek liste öğelerimizi metrics anahtarının altına yerleştirilmiş değerlere göre sıralayabiliriz.

Swift

Not: Bu Firebase ürünü, uygulama klipsi hedefinde kullanılamaz.
 
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")

Objective-C

Not: Bu Firebase ürünü, uygulama klipsi hedefinde kullanılamaz.
 
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];

Diğer veri türlerinin nasıl sıralandığı hakkında daha fazla bilgi için Sorgu verilerinin sıralaması başlıklı makaleyi inceleyin.

Veri filtreleme

Verileri filtrelemek için sorgu oluştururken sınır veya aralık yöntemlerinden herhangi birini bir 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ı belirler.
queryLimitedToLast Sıralı sonuç listesinin sonundan döndürülecek maksimum öğe sayısını belirler.
queryStartingAtValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden büyük veya bu değere eşit öğeleri döndürme
queryStartingAfterValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden büyük öğeleri döndürme
queryEndingAtValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden düşük ya da ona eşit öğeleri döndürme
queryEndingBeforeValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden düşük öğeleri döndürme
queryEqualToValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtara veya değere eşit öğeleri döndürme

Sıralama yöntemlerinin aksine, birden fazla sınır veya aralık işlevini birleştirebilirsiniz. Örneğin, sonuçları belirli bir değer aralığına sınırlamak için queryStartingAtValue ve queryEndingAtValue yöntemlerini birleştirebilirsiniz.

Sonuç sayısını sınırlama

Belirli bir geri çağırma için senkronize edilecek maksimum çocuk sayısını ayarlamak üzere queryLimitedToFirst ve queryLimitedToLast yöntemlerini kullanabilirsiniz. Örneğin, 100 sınırı belirlemek için queryLimitedToFirst kullanırsanız başlangıçta yalnızca 100'e kadar FIRDataEventTypeChildAdded geri çağırma alırsınız. Firebase veritabanınızda 100'den az öğe depolanıyorsa her öğe için bir FIRDataEventTypeChildAdded geri çağırma işlevi tetiklenir.

Öğeler değiştikçe, toplam sayının 100'de kalması için sorguya giren öğeler için FIRDataEventTypeChildAdded geri çağırma ve sorgudan çıkan öğeler için FIRDataEventTypeChildRemoved geri çağırma alırsınız.

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

Swift

Not: Bu Firebase ürünü, uygulama klipsi hedefinde kullanılamaz.
// 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

Not: Bu Firebase ürünü, uygulama klipsi hedefinde kullanılamaz.
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
FIRDatabaseQuery *recentPostsQuery = [[self.ref child:@"posts"] queryLimitedToFirst:100];

Anahtara veya değere göre filtreleme

Sorgular için rastgele başlangıç, bitiş ve eşdeğerlik noktaları seçmek üzere queryStartingAtValue, queryStartingAfterValue, queryEndingAtValue, queryEndingBeforeValue ve queryEqualToValue politikalarını kullanabilirsiniz. Bu, verileri sayfalara ayırmak veya belirli bir değere sahip alt öğeleri olan öğeleri bulmak için yararlı olabilir.

Sorgu verilerinin sıralama şekli

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

queryOrderedByKey

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

  1. 32 bitlik tam sayı olarak ayrıştırılabilen bir anahtara sahip alt öğeler önce gelir ve artan düzende sıralanır.
  2. Anahtarı dize değeri olan alt öğeler, artan sözlük sırasına göre sıralanır.

queryOrderedByValue

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

queryOrderedByChild

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

  1. Belirtilen alt anahtar için nil değerine sahip alt öğeler önce gelir.
  2. Ardından, belirtilen alt anahtar için false değerine sahip alt öğeler gelir. Birden fazla çocuğun değeri false ise anahtara göre alfabetik olarak sıralanır.
  3. Ardından, belirtilen alt anahtar için true değerine sahip alt öğeler gelir. Birden fazla alt öğenin değeri true ise bu öğeler anahtara göre alfabetik olarak sıralanır.
  4. Ardından, sayısal değere sahip alt öğeler artan düzende sıralanır. Belirtilen alt öğe düğümü için birden fazla alt öğenin sayısal değeri aynıysa bu alt öğeler anahtara göre sıralanır.
  5. Dizelerin sıralaması, sayılardan sonra alfabetik olarak artan düzende yapılır. Belirtilen alt öğe düğümü için birden fazla alt öğe aynı değere sahipse bu öğeler anahtara göre alfabetik olarak sıralanır.
  6. Nesneler en son gelir ve anahtara göre artan düzende alfabetik olarak sıralanır.

Dinleyicileri kaldırma

Gözlemciler, bir ViewController'den ayrıldığınızda verileri otomatik olarak senkronize etmeyi durdurmaz. Bir gözlemci düzgün şekilde kaldırılmazsa verileri yerel bellekle senkronize etmeye devam eder ve etkinlik işleyici kapatılırken yakalanan tüm nesneleri tutar. Bu da bellek sızıntılarına neden olabilir. Artık ihtiyaç duyulmayan gözlemcileri, ilişkili FIRDatabaseHandle öğesini removeObserverWithHandle yöntemine ileterek kaldırın.

Bir referansa geri arama bloğu eklediğinizde FIRDatabaseHandle döndürülür. Bu herkese açık kullanıcı adları, geri arama engellemesini kaldırmak için kullanılabilir.

Bir veritabanı referansına birden fazla dinleyici eklendiyse bir etkinlik tetiklendiğinde her dinleyici çağrılır. Bu konumdaki verilerin senkronizasyonunu durdurmak için removeAllObservers yöntemini çağırarak konumdaki tüm gözlemcileri kaldırmanız gerekir.

Bir dinleyicide removeObserverWithHandle veya removeAllObservers çağrısı yapıldığında, dinleyicinin alt düğümlerine kayıtlı dinleyiciler otomatik olarak kaldırılmaz. Bu referansları veya herkese açık kimlikleri kaldırmak için de takip etmeniz gerekir.

Sonraki adımlar