Web'deki Veri Listeleriyle Çalışma

Veritabanı referansı alın

Veritabanından veri okumak veya yazmak için firebase.database.Reference örneğine ihtiyacınız vardır:

Web modular API

import { getDatabase } from "firebase/database";

const database = getDatabase();

Web namespaced API

var database = firebase.database();

Listeleri okuma ve yazma

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 oluşturulan bu anahtarları kullanarak, birkaç istemci, yazma çakışmaları olmadan aynı anda aynı konuma alt öğeler ekleyebilir. push() tarafından oluşturulan benzersiz anahtar bir zaman damgasını temel alır, dolayısıyla liste öğeleri otomatik olarak kronolojik olarak sıralanır.

Alt öğenin otomatik olarak oluşturulan anahtarının değerini veya alt öğe için ayarlanan verileri almak için push() yöntemi tarafından döndürülen yeni verilere yapılan başvuruyu kullanabilirsiniz. push() referansının .key özelliği, otomatik olarak oluşturulan anahtarı içerir.

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

Örneğin, bir sosyal uygulamadaki gönderiler listesine yeni bir gönderi eklemek için push() kullanılabilir:

Web modular API

import { getDatabase, ref, push, set } from "firebase/database";

// Create a new post reference with an auto-generated id
const db = getDatabase();
const postListRef = ref(db, 'posts');
const newPostRef = push(postListRef);
set(newPostRef, {
    // ...
});

Web namespaced API

// Create a new post reference with an auto-generated id
var postListRef = firebase.database().ref('posts');
var newPostRef = postListRef.push();
newPostRef.set({
    // ...
});

Alt etkinlikleri dinle

Alt olaylar, push() yöntemi aracılığıyla eklenen yeni bir alt öğe veya update() yöntemi aracılığıyla güncellenen bir alt öğe gibi bir işlemden bir düğümün alt öğelerinin başına gelen belirli işlemlere yanıt olarak tetiklenir.

Etkinlik Tipik kullanım
child_added Öğe listelerini alın veya öğe listesine yapılan eklemeleri dinleyin. Bu olay, mevcut her alt öğe için bir kez, ardından belirtilen yola her yeni alt öğe eklendiğinde tekrar tetiklenir. Dinleyiciye yeni çocuğun verilerini içeren bir anlık görüntü iletilir.
child_changed Listedeki öğelerde yapılan değişiklikleri dinleyin. Bu olay, bir alt düğüm değiştirildiğinde her zaman tetiklenir. Buna alt düğümün alt öğelerinde yapılan değişiklikler de dahildir. Olay dinleyicisine iletilen anlık görüntü, alt öğeye ilişkin güncellenmiş verileri içerir.
child_removed Listeden kaldırılan öğeleri dinleyin. Bu olay, hemen 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.
child_moved Sıralı bir listedeki öğelerin sırasındaki değişiklikleri dinleyin. child_moved olayları her zaman öğenin sırasının değişmesine neden olan child_changed olayını takip eder (mevcut sıralama yönteminize göre).

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ı, aşağıda gösterildiği gibi bir gönderinin yorumlarındaki etkinliği izlemek için bu yöntemleri birlikte kullanabilir:

Web modular API

import { getDatabase, ref, onChildAdded, onChildChanged, onChildRemoved } from "firebase/database";

const db = getDatabase();
const commentsRef = ref(db, 'post-comments/' + postId);
onChildAdded(commentsRef, (data) => {
  addCommentElement(postElement, data.key, data.val().text, data.val().author);
});

onChildChanged(commentsRef, (data) => {
  setCommentValues(postElement, data.key, data.val().text, data.val().author);
});

onChildRemoved(commentsRef, (data) => {
  deleteComment(postElement, data.key);
});

Web namespaced API

var commentsRef = firebase.database().ref('post-comments/' + postId);
commentsRef.on('child_added', (data) => {
  addCommentElement(postElement, data.key, data.val().text, data.val().author);
});

commentsRef.on('child_changed', (data) => {
  setCommentValues(postElement, data.key, data.val().text, data.val().author);
});

commentsRef.on('child_removed', (data) => {
  deleteComment(postElement, data.key);
});

Değer olaylarını dinleyin

Veri listelerini okumanın önerilen yolu alt olayları dinlemek olsa da, liste referansındaki değer olaylarını dinlemenin yararlı olabileceği durumlar vardır.

Bir veri listesine bir value gözlemcisi eklemek, tüm veri listesini tek bir anlık görüntü olarak döndürür ve daha sonra tek tek alt öğelere erişmek için döngü yapabilirsiniz.

Sorgu için yalnızca tek bir eşleşme olsa bile anlık görüntü hâlâ bir listedir; yalnızca tek bir öğe içerir. Öğeye erişmek için sonucun üzerinden geçmeniz gerekir:

Web modular API

import { getDatabase, ref, onValue } from "firebase/database";

const db = getDatabase();
const dbRef = ref(db, '/a/b/c');

onValue(dbRef, (snapshot) => {
  snapshot.forEach((childSnapshot) => {
    const childKey = childSnapshot.key;
    const childData = childSnapshot.val();
    // ...
  });
}, {
  onlyOnce: true
});

Web namespaced API

ref.once('value', (snapshot) => {
  snapshot.forEach((childSnapshot) => {
    var childKey = childSnapshot.key;
    var childData = childSnapshot.val();
    // ...
  });
});

Bu model, ek alt öğe eklenen olayları dinlemek yerine, bir listenin tüm alt öğelerini tek bir işlemle getirmek 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 Gerçek Zamanlı Veritabanı Query sınıfını kullanabilirsiniz. Ayrıca sıralanan sonucu belirli sayıda sonuca veya bir anahtar veya değer aralığına göre filtreleyebilirsiniz.

Verileri sırala

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
orderByChild() Sonuçları belirtilen alt anahtarın veya iç içe geçmiş 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 tek bir sipariş yöntemi kullanabilirsiniz. Aynı sorguda bir sıralama yöntemini birden çok kez çağırmak hataya neden olur.

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

Web modular API

import { getDatabase, ref, query, orderByChild } from "firebase/database";
import { getAuth } from "firebase/auth";

const db = getDatabase();
const auth = getAuth();

const myUserId = auth.currentUser.uid;
const topUserPostsRef = query(ref(db, 'user-posts/' + myUserId), orderByChild('starCount'));

Web namespaced API

var myUserId = firebase.auth().currentUser.uid;
var topUserPostsRef = firebase.database().ref('user-posts/' + myUserId).orderByChild('starCount');

Bu, bir alt dinleyiciyle birleştirildiğinde, istemciyi, kullanıcı kimliğine dayalı olarak, her gönderinin aldığı yıldız sayısına göre sıralanmış olarak, veritabanındaki yoldan kullanıcının gönderileriyle senkronize eden bir sorguyu tanımlar. Kimlikleri dizin anahtarları olarak kullanma tekniğine veri yayma adı verilir; bu konuda daha fazla bilgiyi Veritabanınızı Yapılandırma bölümünde okuyabilirsiniz.

orderByChild() yöntemine yapılan çağrı, sonuçların sıralanacağı alt anahtarı belirtir. Bu durumda gönderiler ilgili "starCount" alt öğelerinin değerine göre sıralanır. Şuna benzer verileriniz olması durumunda, sorgular iç içe geçmiş çocuklara 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 geçmiş alt öğenin göreceli yolunu belirterek, liste öğelerimizi metrics anahtarının altında yuvalanmış değerlere göre sıralayabiliriz.

Web modular API

import { getDatabase, ref, query, orderByChild } from "firebase/database";

const db = getDatabase();
const mostViewedPosts = query(ref(db, 'posts'), orderByChild('metrics/views'));

Web namespaced API

var mostViewedPosts = firebase.database().ref('posts').orderByChild('metrics/views');

Diğer veri türlerinin nasıl sıralandığı hakkında daha fazla bilgi için bkz . Sorgu verileri nasıl sıralanır ?

Verileri filtreleme

Verileri filtrelemek için, sorgu oluştururken limit veya aralık yöntemlerinden herhangi birini 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 veya ona eşit olan öğeleri döndürün.
startAfter() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden daha büyük öğeleri döndürün.
endAt() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtara veya değere eşit veya ondan küçük öğeleri döndürün.
endBefore() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden daha az olan öğeleri döndürün.
equalTo() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtara veya değere eşit öğeleri döndürün.

Sıralama yöntemlerinden farklı olarak birden fazla limit veya aralık fonksiyonunu 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ırlayın

Belirli bir etkinlik için senkronize edilecek maksimum alt çocuk sayısını ayarlamak için limitToFirst() ve limitToLast() yöntemlerini kullanabilirsiniz. Örneğin, 100'lük bir sınır ayarlamak için limitToFirst() işlevini kullanırsanız, başlangıçta yalnızca 100'e kadar child_added olayı alırsınız. Firebase veritabanınızda depolanan öğe sayısı 100'den azsa her öğe için bir child_added etkinliği tetiklenir.

Öğeler değiştikçe, sorguya giren öğeler için child_added olaylarını ve sorgudan çıkan öğeler için child_removed olaylarını alırsınız; böylece toplam sayı 100'de kalır.

Aşağıdaki örnek, örnek blog uygulamasının, tüm kullanıcıların en son 100 gönderisinin listesini almak için bir sorguyu nasıl tanımladığını gösterir:

Web modular API

import { getDatabase, ref, query, limitToLast } from "firebase/database";

const db = getDatabase();
const recentPostsRef = query(ref(db, 'posts'), limitToLast(100));

Web namespaced API

var recentPostsRef = firebase.database().ref('posts').limitToLast(100);

Bu örnek yalnızca bir sorguyu tanımlar; verileri senkronize etmek için bir dinleyicinin eklenmesi gerekir.

Anahtar veya değere göre filtrele

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

Sorgu verileri nasıl sıralanır?

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

orderByChild

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

  1. Belirtilen alt anahtar için null değeri olan çocuklar önce gelir.
  2. Daha sonra belirtilen alt anahtar için false değerine sahip çocuklar gelir. Birden fazla çocuğun false değeri varsa, bunlar sözlüksel olarak anahtara göre sıralanır.
  3. Daha sonra belirtilen alt anahtar için true değeri olan çocuklar gelir. Birden fazla çocuğun true değeri varsa, bunlar sözlüksel olarak anahtara göre sıralanır.
  4. Daha sonra sayısal değeri olan çocuklar artan düzende sıralanarak gelir. Birden fazla alt öğe, belirtilen alt düğüm için aynı sayısal değere sahipse anahtara göre sıralanır.
  5. Dizeler sayılardan sonra gelir ve sözlükbilimsel olarak artan düzende sıralanır. Birden fazla alt öğe, belirtilen alt düğüm için aynı değere sahipse, bunlar sözlüksel olarak anahtara göre sıralanır.
  6. Nesneler en sonda gelir ve sözlükbilimsel olarak anahtara göre artan düzende sıralanır.

orderByKey

Verilerinizi sıralamak için orderByKey() kullanıldığında, veriler anahtara göre artan sırada döndürülür.

  1. 32 bitlik bir tamsayı olarak ayrıştırılabilen anahtarı olan çocuklar, artan düzende sıralanarak önce gelir.
  2. Anahtarları dize değeri olan çocuklar daha sonra sözlükbilimsel olarak artan düzende sıralanır.

orderByValue

orderByValue() kullanıldığında, çocuklar değerlerine göre sıralanır. Sıralama kriterleri, belirtilen alt anahtarın değeri yerine düğümün değerinin kullanılması dışında orderByChild() ile aynıdır.

Dinleyicileri ayırın

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

Tek bir dinleyiciyi parametre olarak off() öğesine ileterek kaldırabilirsiniz. Bağımsız değişken olmadan konuma off() çağrısı yapmak, o konumdaki tüm dinleyicileri kaldırır.

Bir ana dinleyicide off() işlevinin çağrılması, onun alt düğümlerinde kayıtlı dinleyicileri otomatik olarak kaldırmaz; Geri aramayı kaldırmak için off() işlevi tüm alt dinleyicilerde de çağrılmalıdır.

Sonraki adımlar