Web'deki Veri Listeleri ile Çalışma

Veritabanı referansı alma

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

Web

import { getDatabase } from "firebase/database";

const database = getDatabase();

Web

var database = firebase.database();

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 bu otomatik olarak oluşturulan anahtarları kullanarak çeşitli müşteriler, yazma çakışması olmadan aynı anda aynı konuma alt öğe ekleyebilir. push() tarafından oluşturulan benzersiz anahtar, zaman damgasına dayanır. Bu nedenle, liste öğeleri otomatik olarak kronolojik olarak sıralanır.

Alt öğenin otomatik olarak oluşturulan anahtarının değerini almak veya alt öğe için veri ayarlamak üzere push() yöntemi tarafından döndürülen yeni verilere referans verebilirsiniz. Bir 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 bu otomatik olarak oluşturulan anahtarları kullanabilirsiniz. Daha fazla bilgi için veri dağıtma örneğine bakın.

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

Web

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

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

Alt etkinlikleri dinleme

Alt öğe etkinlikleri, bir işlemden kaynaklanan belirli işlemlere (ör. push() yöntemi aracılığıyla eklenen yeni bir alt öğe veya update() yöntemi aracılığıyla güncellenen bir alt öğe) yanıt olarak tetiklenir.

Etkinlik Tipik kullanım
child_added Öğe listelerini alma veya öğe listesine eklenen öğeleri 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.
child_changed Listedeki öğelerde yapılan değişiklikleri dinleme Bu etkinlik, bir alt düğüm değiştirildiğinde tetiklenir. Buna, alt öğelerin torunlarında yapılan tüm değişiklikler de dahildir. Etkinlik dinleyicisine iletilen anlık görüntü, alt öğeyle ilgili güncellenmiş verileri içerir.
child_removed Bir listeden öğelerin kaldırılmasını 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.
child_moved Sıralı bir listedeki öğelerin sırasıyla ilgili değişiklikleri dinleyin. child_moved etkinlikleri her zaman öğenin sırasının değişmesine neden olan child_changed etkinliğini takip eder (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:

Web

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

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 etkinliklerini dinleme

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 gözlemci eklediğinizde, veri listesinin tamamı tek bir anlık görüntü olarak döndürülür. Bu anlık görüntüyü, tek tek çocuklara erişmek için döngü içinde kullanabilirsiniz.

Sorgu için tek bir eşleşme olsa bile anlık görüntü yine de bir listedir ve yalnızca tek bir öğe içerir. Öğeye erişmek için sonucu döngü içinde incelemeniz gerekir:

Web

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

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

Bu kalıp, ek alt öğe eklenme etkinliklerini dinlemek yerine bir listenin tüm alt öğelerini tek bir işlemde almak istediğinizde yararlı 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 Query sınıfını kullanabilirsiniz. Sıralı sonucu belirli bir sonuç sayısına veya anahtar ya da değer aralığına göre de filtreleyebilirsiniz.

Verileri sıralama

Sıralı verileri almak için sonuçların nasıl sıralandığını belirlemek üzere sıralama yöntemlerinden birini belirterek başlayın:

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 öğe değerlerine göre sıralayın.

Aynı anda yalnızca bir sıralama yöntemi kullanabilirsiniz. Sıralama yönteminin aynı sorgu içinde birden çok kez çağrılması hata verir.

Aşağıdaki örnekte, bir kullanıcının yıldız sayısına göre sıralanmış en popüler gönderilerinin listesini nasıl alabileceğiniz gösterilmektedir:

Web

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

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

Bu, bir alt dinleyiciyle birlikte kullanıldığında istemciyi, kullanıcı kimliğine göre veritabanındaki yoldan kullanıcının yayınlarıyla senkronize eden ve her yayına verilen yıldız sayısına göre sıralayan bir sorgu tanımlar. Kimlikleri dizin anahtarı olarak kullanma tekniğine veri dağıtımı denir. Bu konu hakkında daha fazla bilgiyi Veri Tabanı Oluşturma başlıklı makalede bulabilirsiniz.

orderByChild() yönteminin çağrısı, 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.

Web

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

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

Web

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 Sorgu verilerinin sıralaması başlıklı makaleyi inceleyin.

Veri filtreleme

Verileri filtrelemek için bir 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 döndürülecek maksimum öğe sayısını belirler.
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 bu değere eşit öğeleri döndürme
startAfter() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden büyük öğeleri döndürme
endAt() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden düşük ya da ona eşit öğeleri döndürme
endBefore() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden düşük öğeleri döndürme
equalTo() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtara veya değere eşit öğeleri döndürme

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ığına 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 100 child_added etkinliği alırsınız. Firebase veritabanınızda 100'den az öğe depolanıyorsa her öğe için bir child_added etkinliği tetiklenir.

Öğeler değiştikçe, toplam sayının 100'de kalması için sorguya giren öğeler için child_added etkinliği ve sorgudan çıkan öğeler için child_removed etkinliği alırsınız.

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

Web

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

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

Web

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

Bu örnekte yalnızca bir sorgu tanımlanmaktadır. Verileri senkronize etmek için bağlı bir dinleyici olması 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 verilerinin sıralama şekli

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ı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 çocuğun değeri false ise anahtara göre alfabetik 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 öğe düğümü için birden fazla alt öğenin sayısal değeri aynıysa bu öğeler anahtara göre sıralanır.
  5. Dizelerin sırası, sayılardan sonra gelir ve alfabetik olarak artan düzendedir. Belirtilen alt öğe düğümü için birden fazla alt öğe aynı değere sahipse bu öğeler anahtara göre alfabetik olarak sıralanır.
  6. Nesneler en sonda yer alır ve sözlüklere göre anahtara göre 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 bitlik tam sayı olarak ayrıştırılabilen bir anahtara sahip alt öğeler önce gelir ve artan düzende sıralanır.
  2. Anahtarı dize değeri olan alt öğeler, artan sözlük sırasına göre sıralanır.

orderByValue

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

Dinleyicileri kaldırma

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. Yerde off() işlevi bağımsız değişken olmadan çağrıldığında, söz konusu konumdaki tüm dinleyiciler kaldırılır.

Üst dinleyicide off() çağrıldığında, alt düğümlerine kayıtlı dinleyiciler otomatik olarak kaldırılmaz. Geri çağırma işlevinin kaldırılması için off(), alt dinleyicilerde de çağrılmalıdır.

Sonraki adımlar