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

FIRDatabaseReference alma

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

Swift

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

ref = Database.database().reference()

Objective-C

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

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

Listeleri okuma ve yazma

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

Alt öğenin otomatik olarak üretilmiş anahtarının değerini almak veya alt öğe için veri ayarlamak üzere childByAutoId yönteminin döndürdüğü yeni verilere yapılan referansı kullanabilirsiniz. childByAutoId referansında getKey çağrıldığında otomatik olarak üretilmiş anahtar döndürülür.

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

Alt etkinlikleri dinleme

Alt etkinlikler, bir düğümün alt öğelerinde gerçekleşen belirli işlemlere yanıt olarak tetiklenir. Örneğin, childByAutoId yöntemiyle yeni bir alt öğe eklenmesi veya updateChildValues yöntemiyle bir alt öğenin güncellenmesi gibi işlemler bu kapsamdadır.

Etkinlik türü Tipik kullanım
FIRDataEventTypeChildAdded Öğe listelerini alma veya öğe listesine eklenenleri dinleme 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 Bir listedeki öğelerde yapılan değişiklikleri dinleme. Bu etkinlik, 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. Etkinlik işleyiciye aktarılan anlık görüntü, alt öğenin güncellenmiş verilerini içerir.
FIRDataEventTypeChildRemoved Listeden kaldırılan öğeleri dinleme Bu etkinlik, 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ı listedeki öğelerin sırasındaki değişiklikleri dinleme Bu etkinlik, bir güncelleme alt öğenin yeniden sıralanmasına neden olduğunda tetiklenir. queryOrderedByChild veya queryOrderedByValue ile sıralanan verilerle kullanılır.

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

Swift

Not: Bu Firebase ürünü, Uygulama Klibi 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 Klibi 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 okumak için alt etkinlikleri dinlemek önerilen yöntem olsa da bir liste referansındaki değer etkinliklerini dinlemenin yararlı olduğu durumlar da vardır.

Bir veri listesine FIRDataEventTypeValue gözlemcisi 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 listeyi döngüye alabilirsiniz.

Sorgu için yalnızca tek bir eşleşme olsa bile anlık görüntü yine de bir listedir; yalnızca tek bir öğe içerir. Öğeye erişmek için sonuç üzerinde döngü oluşturmanız gerekir:

Swift

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

Objective-C

Not: Bu Firebase ürünü, Uygulama Klibi 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 ekleme etkinliklerini dinlemek yerine bir listenin tüm alt öğelerini tek bir işlemde getirmek 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ıralanan sonucu belirli sayıda sonuca veya bir anahtar ya da değer aralığına göre de filtreleyebilirsiniz.

Verileri sıralama

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

Yöntem Kullanım
queryOrderedByKey Sonuçları alt anahtarlara göre sıralar.
queryOrderedByValue Sonuçları alt değerlere göre sıralar.
queryOrderedByChild Sonuçları, belirtilen bir alt anahtarın veya iç içe yerleştirilmiş alt yolun değerine göre sıralar.

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

Aşağıdaki örnekte, bir kullanıcının en çok beğenilen yayınlarının listesini yıldız sayısına göre sıralanmış olarak nasıl alabileceğiniz gösterilmektedir:

Swift

Not: Bu Firebase ürünü, Uygulama Klibi 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 Klibi 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 gönderilerini kullanıcı kimliğine göre veritabanındaki yoldan alır ve her gönderinin aldığı yıldız sayısına göre sıralar. Kimlikleri dizin anahtarı olarak kullanma tekniğine veri yayma adı verilir. Bu teknik hakkında daha fazla bilgiyi Veritabanınızı Yapılandırma başlıklı makalede bulabilirsiniz.

queryOrderedByChild yöntemine yapılan çağrı, sonuçların sıralanacağı alt anahtarı belirtir. Bu örnekte, yayınlar her yayındaki "starCount" alt öğesinin değerine göre sıralanır. Sorgular, aşağıdaki gibi verileriniz varsa 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ında iç içe yerleştirilmiş değerlere göre sıralayabiliriz.

Swift

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

Objective-C

Not: Bu Firebase ürünü, Uygulama Klibi 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 verileri nasıl sıralanır? 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 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 anahtardan veya değerden büyük ya da ona eşit olan öğeleri döndürür.
queryStartingAfterValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden daha büyük öğeleri döndürür.
queryEndingAtValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtardan veya değerden küçük ya da ona eşit öğeleri döndürür.
queryEndingBeforeValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden daha küçük öğeleri döndürür.
queryEqualToValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtara veya değere eşit öğeleri döndürür.

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ığıyla 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 alt öğe sayısını ayarlamak üzere queryLimitedToFirst ve queryLimitedToLast yöntemlerini kullanabilirsiniz. Örneğin, queryLimitedToFirst kullanarak 100 sınırı belirlerseniz başlangıçta yalnızca en fazla 100 FIRDataEventTypeChildAdded geri çağırma alırsınız. Firebase veritabanınızda 100'den az öğe varsa her öğe için bir FIRDataEventTypeChildAdded geri çağırma işlevi tetiklenir.

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

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

Swift

Not: Bu Firebase ürünü, Uygulama Klibi 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 Klibi 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 filtrele

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

Sorgu verilerinin sıralanma şekli

Bu bölümde, verilerin FIRDatabaseQuery sınıfındaki sıralama yöntemlerinin her biri tarafından 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 bit tam sayı olarak ayrıştırılabilen bir anahtara sahip alt öğeler, artan düzende sıralanarak ilk sırada yer alır.
  2. Ardından, anahtarı dize değeri olan alt öğeler, alfabetik olarak artan düzende sıralanır.

queryOrderedByValue

queryOrderedByValue kullanılırken alt öğeler 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ı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 alt öğenin değeri false ise anahtara göre sözlük düzeninde sıralanırlar.
  3. Ardından, belirtilen alt anahtar için true değerine sahip alt öğeler gelir. Birden fazla alt öğenin değeri true ise bunlar 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 düğüm için birden fazla alt öğe aynı sayısal değere sahipse bunlar anahtara göre sıralanır.
  5. Dizeler sayılardan sonra gelir ve sözlük düzeninde artan düzende sıralanır. Belirtilen alt düğüm için birden fazla alt öğe aynı değere sahipse bunlar anahtara göre sözlük düzeninde sıralanır.
  6. Nesneler en sonda yer alır ve anahtara göre alfabetik olarak artan düzende sıralanır.

Dinleyicileri ayırma

ViewController oturumundan ayrıldığınızda gözlemciler veri senkronizasyonunu otomatik olarak durdurmaz. Bir gözlemci düzgün şekilde kaldırılmazsa verileri yerel bellekle senkronize etmeye devam eder ve etkinlik işleyici kapatma işleminde yakalanan tüm nesneleri saklar. Bu durum, bellek sızıntılarına neden olabilir. Bir gözlemciye artık ihtiyaç duyulmadığında, ilişkili FIRDatabaseHandle öğesini removeObserverWithHandle yöntemine ileterek gözlemciyi kaldırın.

Bir referansa geri çağırma bloğu eklediğinizde FIRDatabaseHandle döndürülür. Bu tutma yerleri, geri çağırma bloğunu kaldırmak için kullanılabilir.

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

Bir dinleyicide removeObserverWithHandle veya removeAllObservers yöntemini çağırmak, alt düğümlerinde kayıtlı dinleyicileri otomatik olarak kaldırmaz. Bu referansları veya tanıtıcıları da takip ederek kaldırmanız gerekir.

Sonraki adımlar