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.

childByAutoId yöntemi tarafından döndürülen yeni verilere yapılan referansı kullanarak çocuğun otomatik olarak oluşturulan anahtarının değerini alabilir veya çocuk için veri ayarlayabilirsiniz. childByAutoId referansında getKey çağrısı, otomatik olarak oluşturulan anahtarı döndürür.

Veri yapınızı düzleştirme işlemini basitleştirmek için bu otomatik olarak oluşturulan anahtarları kullanabilirsiniz. Daha fazla bilgi için veri dağıtımı örneğini inceleyin.

Alt etkinliklerini dinleme

Çocuk etkinlikleri, bir düğümün çocuklarında meydana gelen 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 işlemler.

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, 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 tüm değişiklikler buna dahildir. Etkinlik işleyicisine iletilen anlık görüntü, alt öğeyle ilgili güncellenmiş verileri içerir.
FIRDataEventTypeChildRemoved Bir listeden kaldırılan öğeleri 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ı listedeki öğelerin sırasıyla ilgili değişiklikleri dinleyin. Bu etkinlik, bir güncelleme nedeniyle çocuğun yeniden sıralanmasına neden olduğunda tetiklenir. queryOrderedByChild veya queryOrderedByValue'ya 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, bir sosyal blog uygulaması, 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 alt etkinlikleri dinlemek önerilen yöntem olsa da liste referansındaki değer etkinliklerini dinlemenin faydalı olduğu durumlar vardır.

Bir veri listesine FIRDataEventTypeValue gözlemci eklemek, tüm veri listesini 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ü yine bir listedir. 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, ek alt öğe ekleme 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ç veya bir anahtar ya da 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 order-by 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 order-by yöntemini birden çok kez çağırmak hataya neden olur.

Aşağıdaki örnekte, bir 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 yayınlarını veritabanındaki yoldan, kullanıcı kimliğine göre alır ve her yayının aldığı yıldız sayısına göre sıralar. Kimlikleri dizin anahtarları olarak kullanma tekniğine veri dağıtımı adı verilir. Bu teknik hakkında daha fazla bilgiyi Veritabanınızı Yapılandırma bölümünde bulabilirsiniz.

queryOrderedByChild yöntemine yapılan çağrı, sonuçları sıralamak için kullanılacak 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 Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtardan veya değerden büyük ya da bu anahtara veya değere 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 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 Sıralama yöntemine bağlı olarak, belirtilen anahtardan 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ö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 alt öğe 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 FIRDataEventTypeChildAdded geri araması alırsınız. Firebase veritabanınızda 100'den az öğe depolanıyorsa her öğe için bir FIRDataEventTypeChildAdded geri çağırma işlemi tetiklenir.

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

Aşağıdaki örnekte, örnek bir blog uygulamasıyla tüm kullanıcıların en son 100 yayınının 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 alt öğeleri olan öğeleri 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öntemine göre nasıl sıralandığı açıklanmaktadır.

queryOrderedByKey

Verilerinizi sıralamak için queryOrderedByKey işlevini kullandığınızda veriler, anahtara göre artan düzende döndürülür.

  1. 32 bitlik bir tam sayı olarak ayrıştırılabilen anahtara sahip çocuklar, artan düzende sıralanarak ilk sırada yer alır.
  2. Anahtarı dize değeri olan çocuklar, sözlük sıralaması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 şu şekilde sıralanır:

  1. Belirtilen çocuk anahtarı için nil değeri olan çocuklar önce gelir.
  2. Belirtilen alt anahtar için false değerine sahip alt öğeler bir sonraki sırada yer alır. Birden fazla alt öğe false değerine sahipse anahtara göre sözlük sırasına göre sıralanır.
  3. Belirtilen alt anahtar için true değerine sahip alt öğeler bir sonraki sırada yer alır. Birden fazla alt öğenin değeri true ise bunlar 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ük sırasına göre 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 artan sözlük sıralamasıyla sıralanır.

Dinleyicileri ayırma

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