Veri Listeleriyle Çalışma

Veritabanı referansı alma

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

DatabaseReference ref = FirebaseDatabase.instance.ref();

Okuma ve yazma listeleri

Veri listesine ekle

Ç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 oluşturulan bu anahtarları kullanarak, bazı istemciler yazma çakışmaları olmadan aynı anda aynı konuma alt öğeler ekleyebilir. push() tarafından oluşturulan benzersiz anahtar bir zaman damgasına dayanır. Böylece liste öğeleri otomatik olarak kronolojik olarak sıralanır.

Alt yayıncının otomatik olarak oluşturulan anahtarın değerini öğrenmek veya alt öğe için verileri ayarlamak üzere push() yöntemi tarafından döndürülen yeni verilere referansı kullanabilirsiniz. Bir push() referansının .key özelliği, otomatik olarak oluşturulan anahtarı içerir.

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.

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

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

Çocuk etkinliklerini dinle

Alt etkinlikler, push() yöntemiyle eklenen yeni bir alt öğe veya update() 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 Tipik kullanım
onChildAdded Öğ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.
onChildChanged Listedeki öğelerde yapılan değişiklikleri bekleyin. Bu etkinlik, bir alt düğüm her değiştirildiğinde tetiklenir. Buna alt düğümün alt öğelerinde yapılan değişiklikler de dahildir. Etkinlik işleyiciye iletilen anlık görüntü, alt öğeye ait güncellenmiş verileri içerir.
onChildRemoved 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.
onChildMoved Sıralı listedeki öğelerin sırasındaki değişiklikleri bekleyin. onChildMoved etkinlikleri, her zaman öğenin sırasının değişmesine neden olan onChildChanged etkinliğini izler (geçerli sıralama yönteminize göre).

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:

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 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 value işleyici eklemek, veri listesinin tamamını tek bir anlık görüntü olarak döndürür ve daha sonra alt öğelere erişmek için geçiş yapabilirsiniz.

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.

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

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 Query 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
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ıralayın.
orderByValue() Sonuçları alt değerlere 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:

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

Bu, bir alt işleyici ile birleştirildiğinde, istemcinin kullanıcı kimliğine göre veritabanındaki yoldan kullanıcının yayınları ile senkronize edilmesini sağlayan bir sorgu tanımlar. Kullanıcı kimlikleri, her bir 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.

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

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 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
limitToFirst() Sıralı sonuç listesinin başlangıcı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 veya ona eşit olan öğeleri döndürün.
startAfter() Seçilen yönteme göre belirlenen anahtar veya değerden daha yüksek olan öğeleri döndürür.
endAt() 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.
endBefore() Seçilen yönteme göre belirlenen anahtar veya değerden daha düşük olan öğeleri döndürür.
equalTo() 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 startAt() ve endAt() yöntemlerini birleştirebilirsiniz.

Sonuç sayısını sınırlandırın

Belirli bir etkinlik için senkronize edilecek maksimum alt öğe sayısını ayarlamak için limitToFirst() ve limitToLast() yöntemlerini kullanabilirsiniz. Örneğin, limitToFirst() kullanarak sınır 100 olarak belirlerseniz başlangıçta en fazla 100 onChildAdded etkinliği alırsınız. Firebase veritabanınızda depolanan öğe sayısı 100'den azsa her öğe için bir onChildAdded etkinliği tetiklenir.

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

Aşağıdaki örnekte, örnek blogging uygulamasının tüm kullanıcılar tarafından yapılan en son 100 yayının listesini almak için bir sorguyu nasıl tanımladığı gösterilmektedir:

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

Bu örnek yalnızca bir sorguyu tanımlar; verilerin senkronize edilebilmesi için ekli bir işleyici içermesi gerekir.

Anahtar veya değere göre filtreleyin

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

Sorgu verileri nasıl sıralanır?

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

orderByChild

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

  1. Belirtilen alt anahtarda null 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.

orderByKey

Verilerinizi sıralamak için orderByKey() 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.

orderByValue

orderByValue() kullanılırken alt öğeler değerlerine göre sıralanır. Sıralama ölçütleri orderByChild() ile aynıdır. Tek fark, belirtilen alt anahtarın değeri yerine düğümün değerinin kullanılmasıdır.

Dinleyicileri ayır

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

Tek bir işleyiciyi off() öğesine parametre olarak ileterek kaldırabilirsiniz. off() uygulamasının konumda bağımsız değişken olmadan çağrılması, söz konusu konumdaki tüm dinleyicileri kaldırır.

Bir üst işleyicide off() çağrısı yapıldığında, alt düğümlerde kayıtlı işleyiciler otomatik olarak kaldırılmaz. Geri çağırmanın kaldırılması için tüm alt işleyicilerde de off() çağrılmalıdır.

Sonraki adımlar