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

FIRDatabaseReference alma

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

Swift

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

ref = Database.database().reference()

Objective-C

Not: Bu Firebase ürünü, App Clip 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 alt öğe 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ışmaları olmadan aynı anda aynı konuma alt öğeler 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.

Çocuğun otomatik olarak oluşturulan anahtarının değerini almak veya çocuk için veri ayarlamak üzere childByAutoId yöntemi tarafından döndürülen yeni verilere yapılan referansı kullanabilirsiniz. Bir 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 otomatik olarak oluşturulan bu anahtarları kullanabilirsiniz. Daha fazla bilgi için veri dağıtımı örneğine bakın.

Alt etkinlikleri dinleme

Çocuk etkinlikleri, bir düğümün çocuklarında gerçekleşen belirli işlemlere yanıt olarak tetiklenir. Örneğin, childByAutoId yöntemiyle yeni bir çocuk eklenmesi veya updateChildValues yöntemiyle bir çocuğun güncellenmesi gibi.

Etkinlik türü Normal kullanım
FIRDataEventTypeChildAdded Öğe listelerini alma veya öğe listesine eklenenleri dinleme Bu etkinlik, her mevcut alt öğe için bir kez, ardından belirtilen yola yeni bir 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. Çocuk düğümünün alt öğelerinde yapılan değişiklikler de buna dahildir. Etkinlik dinleyiciye aktarılan anlık görüntü, çocuğun güncellenmiş verilerini içerir.
FIRDataEventTypeChildRemoved Listeden kaldırılan öğeleri dinleme 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ı listedeki öğelerin sırasındaki değişiklikleri dinleyin. Bu etkinlik, bir güncelleme nedeniyle alt öğenin yeniden sıralanmasına neden olduğunda tetiklenir. queryOrderedByChild veya queryOrderedByValue'ye göre sıralanmış 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, sosyal blog uygulamaları, bir gönderinin yorumlarındaki etkinliği izlemek için bu yöntemleri birlikte kullanabilir.

Swift

Not: Bu Firebase ürünü, App Clip 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ü, App Clip 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 önerilen yöntem alt etkinlikleri dinlemek olsa da liste referansındaki değer etkinliklerini dinlemenin faydalı olduğu durumlar vardır.

Bir veri listesine FIRDataEventTypeValue gözlemcisi eklemek, veri listesinin tamamını tek bir DataSnapshot olarak döndürür. Daha sonra tek tek alt öğelere erişmek için bu listede döngü oluşturabilirsiniz.

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üye almanız gerekir:

Swift

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

Objective-C

Not: Bu Firebase ürünü, App Clip 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, eklenen alt öğe etkinliklerini dinlemek yerine bir listedeki tüm alt öğeleri tek bir işlemde getirmek istediğinizde faydalı olabilir.

Verileri sıralama ve filtreleme

Anahtara, değere veya alt öğenin değerine göre sıralanmış verileri almak için Realtime Database FIRDatabaseQuery sınıfını kullanabilirsiniz. Sıralanmış sonucu belirli sayıda sonuç, anahtar aralığı veya değer aralığına göre de filtreleyebilirsiniz.

Verileri sıralama

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 öğ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. Aynı sorguda bir sıralama yöntemini birden çok kez çağırmak hataya neden olur.

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

Swift

Not: Bu Firebase ürünü, App Clip 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ü, App Clip 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 veritabanındaki yoldan, kullanıcı kimliğine göre 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 dağıtımı 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ı sıralamak için alt anahtarı belirtir. Bu örnekte, yayınlar her yayındaki "starCount" alt öğesinin değerine göre sıralanır. Aşağıdaki gibi verileriniz varsa sorgular 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, metrics anahtarı altında iç içe yerleştirilmiş değerlere göre liste öğelerimizi sıralayabiliriz. Bunun için queryOrderedByChild çağrımızda iç içe yerleştirilmiş alt öğeye giden göreli yolu belirtmemiz gerekir.

Swift

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

Objective-C

Not: Bu Firebase ürünü, App Clip 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 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 Sıralama yöntemine bağlı olarak, belirtilen anahtardan veya değerden büyük ya da ona eşit öğeleri döndürür.
queryStartingAfterValue Sıralama yöntemine bağlı olarak, belirtilen anahtardan veya değerden 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 anahtardan veya değerden 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öntemlerinden farklı olarak, 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 çocuk sayısı belirlemek ü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 FIRDataEventTypeChildAdded geri araması alırsınız. Firebase veritabanınızda 100'den az öğe varsa her öğe için bir FIRDataEventTypeChildAdded geri çağırma işlemi tetiklenir.

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

Aşağıdaki örnekte, örnek bir blog uygulaması tarafından tüm kullanıcıların en son 100 gönderisinin listesinin nasıl alınabileceği gösterilmektedir:

Swift

Not: Bu Firebase ürünü, App Clip 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ü, App Clip 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 öğelerini kullanabilirsiniz. Bu, verileri sayfalara ayırmak veya belirli bir değere sahip çocuk öğelerini bulmak için yararlı olabilir.

Sorgu verilerinin sıralanma şekli

Bu bölümde, verilerin FIRDatabaseQuery sınıfındaki her bir sıralama yöntemiyle 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 çocuklar, artan düzende sıralanarak önce gelir.
  2. Anahtarı dize değeri olan çocuklar, sözlük sırasına göre artan düzende sıralanır.

queryOrderedByValue

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

queryOrderedByChild

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

  1. Belirtilen çocuk anahtarı için nil değeri olan çocuklar ilk sırada yer alır.
  2. Belirtilen çocuk anahtarı için değeri false olan çocuklar gelir. Birden fazla alt öğenin değeri false ise bunlar anahtara göre sözlük sırasına göre sıralanır.
  3. Belirtilen çocuk anahtarı için değeri true olan çocuklar gelir. Birden fazla alt öğe true değerine sahipse anahtara göre sözlük sırasına göre sıralanır.
  4. Sayısal değere sahip çocuklar, artan düzende sıralanarak gösterilir. 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ükbilimsel olarak 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 sırasına göre sıralanır.
  6. Nesneler en sona gelir ve anahtara göre sözlük sırasına göre artan düzende sıralanır.

İşleyicileri ayırma

Gözlemciler, bir ViewController'dan ayrıldığınızda verileri senkronize etmeyi otomatik olarak durdurmaz. Bir gözlemci düzgün şekilde kaldırılmazsa verileri yerel belleğe senkronize etmeye devam eder ve etkinlik işleyici kapatma işleminde yakalanan tüm nesneleri korur. Bu durum, bellek sızıntılarına neden olabilir. 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 arama engelini kaldırmak için kullanılabilir.

Bir veritabanı referansına birden fazla dinleyici eklenmişse bir etkinlik oluşturulduğunda her dinleyici çağrılır. Verilerin bu konumda senkronize edilmesini 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ı yapmak, alt düğümlerine kayıtlı dinleyicileri otomatik olarak kaldırmaz. Bu dinleyicileri kaldırmak için bu referansları veya tutamaçları da takip etmeniz gerekir.

Sonraki adımlar