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

FIRDatabaseReference alma

Veritabanından veri okumak veya yazmak için FIRDatabaseReference örneğinin olması gerekir:

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 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 alt öğe eklendiğinde benzersiz bir anahtar oluşturur. Listedeki her yeni öğe için otomatik olarak oluşturulan bu anahtarları kullanarak, bazı istemciler yazma çakışmaları olmadan aynı anda aynı konuma alt öğeler 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 yayıncının otomatik olarak oluşturulan anahtarın değerini almak veya alt öğe için verileri ayarlamak üzere childByAutoId yöntemi tarafından döndürülen yeni verilere referansı kullanabilirsiniz. childByAutoId referansı için getKey çağrısı yapıldığında otomatik olarak oluşturulan anahtar döndürülür.

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

Çocuk etkinliklerini dinle

Alt etkinlikler, childByAutoId yöntemiyle eklenen yeni bir alt öğe veya updateChildValues yöntemiyle güncellenen bir alt öğe gibi bir işlemdeki düğümün alt öğelerine yapılan belirli işlemlere yanıt olarak tetiklenir.

Etkinlik türü Tipik kullanım
FIRDataEventTypeChildAdded Öğe listelerini alın veya öğe listesine yapılan eklemeleri dinleyin. Bu etkinlik, mevcut her alt öğe için bir kez ve belirtilen yola her yeni alt öğe eklendiğinde tekrar tetiklenir. İşleyiciye, yeni alt öğenin verilerini içeren bir anlık görüntü iletilir.
FIRDataEventTypeChildChanged Listedeki öğelerde yapılan değişiklikleri bekleyin. Bu etkinlik, bir alt düğüm her değiştirildiğinde tetiklenir. Alt düğümün alt öğelerinde yapılan değişiklikler de buna dahildir. Etkinlik işleyiciye iletilen anlık görüntü, alt öğeye ait güncellenmiş verileri içerir.
FIRDataEventTypeChildRemoved Bir listeden kaldırılan öğeleri bekleyin. Bu etkinlik, hemen bir alt öğe kaldırıldığında tetiklenir.Geri çağırma blokuna iletilen anlık görüntü, kaldırılan alt öğeye ait verileri içerir.
FIRDataEventTypeChildMoved Sıralı listedeki öğelerin sırasındaki değişiklikleri bekleyin. Bir güncelleme, alt öğenin yeniden sıralanmasına neden olduğunda bu etkinlik tetiklenir. queryOrderedByChild veya queryOrderedByValue bazında sıralanan verilerle kullanılır.

Bunların her biri, veritabanındaki belirli bir düğümde yapılan değişiklikleri dinlemek için faydalı olabilir. Örneğin, bir sosyal blog uygulaması bir yayının yorumlarındaki etkinliği izlemek için aşağıda gösterildiği gibi 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 etkinliklerine göz atın

Veri listelerini okumak için alt etkinlikleri dinlemek önerilen yöntemdir ancak bir liste referansındaki değer etkinliklerini dinlemenin kullanışlı olduğu durumlar da vardır.

Bir veri listesine FIRDataEventTypeValue gözlemleyicisi eklendiğinde, veri listesinin tamamı tek bir DataSnapshot halinde döndürülür. Daha sonra bu bilgileri tek tek alt öğelere erişmek için devre dışı bırakabilirsiniz.

Sorgu için tek bir eşleşme olsa bile anlık görüntü yine de bir liste olarak kalır ve yalnızca tek bir öğe içerir. Öğeye erişmek için sonucun üstünden geçmeniz 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, başka alt etkinlikleri dinlemek yerine bir listenin tüm alt öğelerini tek bir işlemde getirmek istediğinizde kullanışlı olabilir.

Verileri sıralama ve filtreleme

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

Verileri sırala

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

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 yerleştirilmiş alt yolun değerine göre sıralayın.

Aynı anda yalnızca bir sıralama yöntemi kullanabilirsiniz. Bir sıralama yönteminin aynı sorguda birden çok kez çağrılması hataya neden olur.

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

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ı kullanıcı kimliğine göre veritabanındaki yoldan alır. Bu sıralama, her yayının aldığı yıldız sayısına göre sıralanır. Kimlikleri dizin anahtarı olarak kullanma tekniği "veri yayma" olarak adlandırılır. 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ı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 görünen verileriniz olması 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 örnekte, queryOrderedByChild çağrımızda iç içe yerleştirilmiş alt öğenin göreli yolunu belirterek liste öğelerimizi metrics anahtarı altında iç içe yerleştirilmiş değerlere göre sıralayabiliriz.

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? bölümüne bakın.

Veri filtreleme

Verileri filtrelemek için bir sorgu oluştururken sınır veya aralık yöntemlerinden herhangi birini tek bir sıralama yöntemiyle birleştirebilirsiniz.

Yöntem Kullanım
queryLimitedToFirst Sıralı sonuç listesinin başlangıcı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 anahtar veya değerden büyük veya ona eşit olan öğeleri döndürün.
queryStartingAfterValue Seçilen yönteme göre belirlenen yönteme göre, belirtilen anahtar veya değerden daha yüksek olan öğeleri döndürür.
queryEndingAtValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden düşük veya ona eşit olan öğeleri döndürün.
queryEndingBeforeValue Seçilen yönteme göre belirlenen yönteme göre, belirtilen anahtar veya değerden daha düşük olan öğeleri döndürür.
queryEqualToValue Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değere eşit öğeleri döndürür.

Sıralama ölçütü yöntemlerinden farklı olarak birden çok sınırlama 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ırlandırın

Belirli bir geri çağırma işlemi için senkronize edilecek maksimum alt öğe sayısını ayarlamak için queryLimitedToFirst ve queryLimitedToLast yöntemlerini kullanabilirsiniz. Örneğin, 100 sınır belirlemek için queryLimitedToFirst kullanırsanız başlangıçta en fazla 100 FIRDataEventTypeChildAdded geri çağırması alırsınız. Firebase veritabanınızda depolanan öğe sayısı 100'den azsa her öğe için FIRDataEventTypeChildAdded geri çağırması etkinleşir.

Öğeler değiştikçe sorguya giren öğeler için FIRDataEventTypeChildAdded geri çağırma, sorgudan çıkan öğeler için ise 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 tarafından yapılan en son 100 yayının listesini nasıl alabileceğ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];

Anahtar veya değere göre filtreleyin

Sorgular için rastgele başlangıç, bitiş ve denklik noktalarını seçmek amacıyla queryStartingAtValue, queryStartingAfterValue, queryEndingAtValue, queryEndingBeforeValue ve queryEqualToValue tuşlarını kullanabilirsiniz. Bu, verileri sayfalara ayırırken veya çocuklara yönelik belirli bir değeri olan öğeleri bulurken faydalı olabilir.

Sorgu verileri nasıl sıralanır?

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

queryOrderedByKey

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

  1. 32 bit tam sayı olarak ayrıştırılabilen bir anahtarı olan alt öğeler önce gelir ve artan düzende sıralanır.
  2. Anahtarlarında dize değeri olan alt öğeler sıradaki sırayla, sözlüksel 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 queryOrderedByChild ile aynıdır. Tek fark, belirtilen alt anahtarın değeri yerine düğümün değerinin kullanılmasıdır.

queryOrderedByChild

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

  1. Belirtilen alt anahtarda nil değerine sahip olan alt öğeler önce gelir.
  2. Belirtilen alt anahtar için false değerine sahip olan alt öğeler ardından gelir. Birden fazla alt öğe false değerine sahipse bunlar anahtara göre sözlüksel olarak sıralanır.
  3. Belirtilen alt anahtar için true değerine sahip olan alt öğeler ardından gelir. Birden fazla alt öğe true değerine sahipse bunlar sözlüksel olarak anahtara göre sıralanır.
  4. Sayısal değere sahip olan alt öğeler artan düzende sıralanır. Belirtilen alt düğüm için aynı sayısal değere sahip birden fazla alt öğe varsa bunlar anahtara göre sıralanır.
  5. Dizeler sayılardan sonra gelir ve sözlüksel olarak artan düzende sıralanır. Birden fazla alt düğüm, belirtilen alt düğüm için aynı değere sahipse bunlar sözlüksel olarak anahtara göre sıralanır.
  6. Nesneler son sırada gelir ve anahtara göre sözlüksel olarak artan düzende sıralanır.

Dinleyicileri ayır

ViewController cihazından ayrıldığınızda gözlemciler veri senkronizasyonunu otomatik olarak durdurmaz. 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 nesneleri saklar. Bu da 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 arama bloğu eklediğinizde FIRDatabaseHandle döndürülür. Bu herkese açık kullanıcı adları, geri çağırma engellemesini kaldırmak için kullanılabilir.

Veritabanı referansına birden fazla işleyici eklenmişse bir etkinlik oluşturulduğunda her işleyici çağrılır. Bu konumdaki verilerin senkronizasyonunu durdurmak için removeAllObservers yöntemini çağırarak bir konumdaki tüm gözlemcileri kaldırmanız gerekir.

Bir işleyicide removeObserverWithHandle veya removeAllObservers çağrılması, alt düğümlerinde kayıtlı işleyicileri otomatik olarak kaldırmaz. Ayrıca, bunları kaldırmak için bu referansları veya herkese açık kullanıcı adlarını da takip etmeniz gerekir.

Sonraki adımlar