Web'deki Veri Listeleri ile Çalışma

Veritabanı referansı alma

Veritabanından veri okumak veya yazmak için firebase.database.Reference örneğinin olması gerekir:

Web modüler API

import { getDatabase } from "firebase/database";

const database = getDatabase();

Web ad alanı API'si

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 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:

Web modüler 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 ad alanı API'si

// Create a new post reference with an auto-generated id
var postListRef = firebase.database().ref('posts');
var 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
child_added Öğ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.
child_changed 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.
child_removed 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.
child_moved Sıralı listedeki öğelerin sırasındaki değişiklikleri bekleyin. 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 modüler 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 ad alanı API'si

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 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 gözlemleyicisi 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.

Web modüler 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 ad alanı API'si

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

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 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:

Web modüler 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 ad alanı API'si

var myUserId = firebase.auth().currentUser.uid;
var topUserPostsRef = firebase.database().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.

Web modüler API

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

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

Web ad alanı API'si

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 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 child_added etkinliği 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 etkinlik, sorgudan çıkan öğeler için de child_removed 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:

Web modüler API

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

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

Web ad alanı API'si

var recentPostsRef = firebase.database().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