Veri Listeleriyle Çalışma

Veritabanı referansı alma

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

DatabaseReference ref = FirebaseDatabase.instance.ref();

Okuma ve yazma listeleri

Veri listesine ekleme

Çok kullanıcılı uygulamalarda bir listeye veri eklemek için push() yöntemini kullanın. push() 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ı anda aynı konuma alt öğe ekleyebilir. push() tarafından oluşturulan benzersiz anahtar, zaman damgasını temel alı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 push() yönteminin döndürdüğü yeni verilere yapılan referansı kullanabilirsiniz. Bir push() referansının .key özelliği, otomatik olarak üretilmiş anahtarı içerir.

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ğine bakın.

Örneğin, bir sosyal uygulamadaki yayın listesine yeni bir yayın eklemek için push() kullanılabilir:

DatabaseReference postListRef = FirebaseDatabase.instance.ref("posts");
DatabaseReference newPostRef = postListRef.push();
newPostRef.set({
  // ...
});

Alt etkinlikleri dinleme

Alt etkinlikler, bir düğümün alt öğelerinde gerçekleşen belirli işlemlere yanıt olarak tetiklenir. Örneğin, push() yöntemiyle yeni bir alt öğe eklenmesi veya update() yöntemiyle bir alt öğenin güncellenmesi gibi.

Etkinlik Tipik kullanım
onChildAdded Öğ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.
onChildChanged 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 iletilen anlık görüntü, alt öğenin güncellenmiş verilerini içerir.
onChildRemoved 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.
onChildMoved Sıralı listedeki öğelerin sırasındaki değişiklikleri dinleme onChildMoved etkinlikleri her zaman, öğenin sırasının değişmesine neden olan onChildChanged etkinliğini (mevcut sıralama yönteminize göre) takip eder.

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ının yorumlarındaki etkinliği izlemek için bu yöntemleri birlikte kullanabilir:

final commentsRef = FirebaseDatabase.instance.ref("post-comments/$postId");
commentsRef.onChildAdded.listen((event) {
  // A new comment has been added, so add it to the displayed list.
});
commentsRef.onChildChanged.listen((event) {
  // A comment has changed; use the key to determine if we are displaying this
  // comment and if so displayed the changed comment.
});
commentsRef.onChildRemoved.listen((event) {
  // A comment has been removed; use the key to determine if we are displaying
  // this comment and if so remove it.
});

Değer etkinliklerini dinleme

Veri listelerini okumak için alt etkinlikleri dinlemek önerilen yöntem olsa da liste referansındaki değer etkinliklerini dinlemenin yararlı olduğu durumlar da vardır.

Bir veri listesine value dinleyicisi eklediğinizde veri listesinin tamamı tek bir anlık görüntü olarak döndürülür. Ardından, tek tek alt öğelere erişmek için bu anlık görüntü üzerinde döngü oluşturabilirsiniz.

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:

myTopPostsQuery.onValue.listen((event) {
  for (final child in event.snapshot.children) {
    // Handle the post.
  }
}, onError: (error) {
  // Error.
});

Bu kalıp, ek alt öğe ekleme 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 Query 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
orderByChild() Sonuçları, belirtilen bir alt anahtarın veya iç içe yerleştirilmiş alt yolun değerine göre sıralayın.
orderByKey() Sonuçları alt anahtarlara göre sıralar.
orderByValue() Sonuçları alt değerlere 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 popüler yayınlarının yıldız sayısına göre sıralanmış listesini nasıl alabileceğiniz gösterilmektedir:

final myUserId = FirebaseAuth.instance.currentUser?.uid;
final topUserPostsRef = FirebaseDatabase.instance
    .ref("user-posts/$myUserId")
    .orderByChild("starCount");

Bu, alt dinleyici ile birleştirildiğinde istemciyi, kullanıcının veritabanındaki yoldan alınan gönderileriyle senkronize eden bir sorgu tanımlar. Bu sorgu, kullanıcının kimliğine göre yapılır ve her gönderinin aldığı yıldız sayısına göre sıralanır. Kimlikleri dizin anahtarı olarak kullanma tekniğine veri yayma adı verilir. Bu konu hakkında daha fazla bilgiyi Veritabanınızı Yapılandırma başlıklı makalede bulabilirsiniz.

orderByChild() yöntemine yapılan çağrı, sonuçların sıralanacağı alt anahtarı belirtir. Bu durumda yayınlar, ilgili "starCount" alt öğelerinin 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, orderByChild() ç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.

final mostViewedPosts =
    FirebaseDatabase.instance.ref('posts').orderByChild('metrics/views');

Diğer veri türlerinin nasıl sıralandığı hakkında daha fazla bilgi için Sorgu verilerinin sıralanma şekli 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
limitToFirst() Sıralı sonuç listesinin başından itibaren döndürülecek maksimum öğe sayısını ayarlar.
limitToLast() Sıralı sonuç listesinin sonundan döndürülecek maksimum öğe sayısını ayarlar.
startAt() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden büyük ya da ona eşit öğeleri döndürür.
startAfter() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden daha büyük öğeleri döndürür.
endAt() 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.
endBefore() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden daha küçük öğeleri döndürür.
equalTo() 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 startAt() ve endAt() yöntemlerini birleştirebilirsiniz.

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

Belirli bir etkinlik için senkronize edilecek maksimum alt öğe sayısını ayarlamak üzere limitToFirst() ve limitToLast() yöntemlerini kullanabilirsiniz. Örneğin, 100 sınırı belirlemek için limitToFirst() kullanırsanız başlangıçta yalnızca en fazla 100 onChildAdded etkinliği alırsınız. Firebase veritabanınızda 100'den az öğe depolanıyorsa her öğe için bir onChildAdded etkinliği tetiklenir.

Öğeler değiştikçe, sorguya giren öğeler için onChildAdded etkinlikleri ve sorgudan çıkan öğeler için onChildRemoved etkinlikleri alırsınız. Böylece toplam sayı 100'de kalır.

Aşağıdaki örnekte, örnek blog uygulamasının tüm kullanıcıların en son 100 yayınını içeren bir listeyi almak için nasıl sorgu tanımladığı gösterilmektedir:

final recentPostsRef = FirebaseDatabase.instance.ref('posts').limitToLast(100);

Bu örnekte yalnızca bir sorgu tanımlanmaktadır. Verilerin senkronize edilmesi için ekli bir dinleyici olması gerekir.

Anahtara veya değere göre filtrele

Sorgular için rastgele başlangıç, bitiş ve eşdeğerlik noktaları seçmek üzere startAt(), startAfter(),endAt(), endBefore() ve equalTo() parametrelerini kullanabilirsiniz. Bu, verileri sayfalara ayırmak veya belirli bir değere sahip alt öğeleri bulmak için yararlı olabilir.

Sorgu verilerinin sıralanma şekli

Bu bölümde, verilerin Query sınıfındaki sıralama yöntemlerinin her biri tarafından nasıl sıralandığı açıklanmaktadır.

orderByChild

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

  1. Belirtilen alt anahtar için null 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 bunlar anahtara göre sözlük düzeninde 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 bunlar anahtara göre alfabetik olarak sıralanır.
  4. Sayısal değere sahip alt öğeler, artan düzende sıralanmış olarak gelir. Belirtilen alt düğüm için birden fazla alt öğe aynı sayısal değere sahipse anahtara göre sıralanır.
  5. Dizeler sayılardan sonra gelir ve sözlük düzeninde artan şekilde 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.

orderByKey

Verilerinizi sıralamak için orderByKey() 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 çocuklar, alfabetik olarak artan düzende sıralanır.

orderByValue

orderByValue() 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 orderByChild() ile aynıdır.

Dinleyicileri ayırma

Geri çağırmalar, Firebase veritabanı referansınızda off() yöntemi çağrılarak kaldırılır.

Tek bir dinleyiciyi off() parametresi olarak ileterek kaldırabilirsiniz. Konumda bağımsız değişken olmadan off() çağrıldığında, ilgili konumdaki tüm dinleyiciler kaldırılır.

Üst dinleyicide off() yöntemini çağırmak, alt düğümlerinde kayıtlı dinleyicileri otomatik olarak kaldırmaz. Geri çağırmayı kaldırmak için alt dinleyicilerde de off() yönteminin çağrılması gerekir.

Sonraki adımlar