Web'deki Veri Listeleri ile Çalışma

Veritabanı referansı alma

Veri tabanından veri okumak veya veri tabanına veri 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 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 birden fazla istemci, yazma çakışmaları olmadan aynı anda aynı konuma alt öğeler ekleyebilir. push() tarafından oluşturulan benzersiz anahtar, zaman damgasına dayalıdır. Bu nedenle, liste öğeleri otomatik olarak kronolojik sıraya göre sıralanır.

push() yöntemi tarafından döndürülen yeni verilere yapılan referansı kullanarak çocuğun otomatik olarak oluşturulan anahtarının değerini alabilir veya çocuk için veri ayarlayabilirsiniz. push() referansının .key özelliği, otomatik olarak oluşturulan anahtarı içerir.

Veri yapınızı düzleştirme işlemini basitleştirmek için bu otomatik olarak oluşturulan anahtarları kullanabilirsiniz. Daha fazla bilgi için veri dağıtımı örneğini inceleyin.

Örneğin, push(), bir sosyal uygulamadaki gönderi listesine yeni bir gönderi 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 etkinliklerini dinleme

Çocuk etkinlikleri, bir düğümün çocuklarında gerçekleşen belirli işlemlere yanıt olarak tetiklenir. Örneğin, push() yöntemiyle yeni bir çocuk eklenmesi veya update() yöntemiyle bir çocuğun güncellenmesi gibi işlemler.

Etkinlik Tipik kullanım
child_added Öğe listelerini alma veya öğe listesine eklenenleri dinleme Bu etkinlik, mevcut her alt öğe için bir kez, ardından belirtilen yola yeni bir alt öğe eklendiğinde tekrar tetiklenir. Dinleyiciye, yeni alt öğenin verilerini içeren bir anlık görüntü iletilir.
child_changed 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şleyicisine iletilen anlık görüntü, çocuğa ait güncellenmiş verileri içerir.
child_removed Bir listeden kaldırılan öğeleri 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ı 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 (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 gönderinin yorumlarındaki etkinliği izlemek için 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öntem olsa da liste referansındaki değer etkinliklerini dinlemenin faydalı olduğu durumlar vardır.

Bir veri listesine value gözlemcisi eklemek, veri listesinin tamamını tek bir anlık görüntü olarak döndürür. Daha sonra bu anlık görüntüyü döngüye alarak tek tek alt öğelere erişebilirsiniz.

Sorgu için yalnızca tek bir eşleşme olsa bile anlık görüntü yine bir listedir. Yalnızca tek bir öğe içerir. Öğeye erişmek için sonucu döngüye almanız 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 ekleme etkinliklerini dinlemek yerine bir listedeki tüm alt öğeleri tek bir işlemde getirmek istediğinizde faydalı olabilir.

Verileri sıralama ve filtreleme

Anahtara, değere veya alt öğenin değerine göre sıralanmış verileri almak için Realtime Database Query sınıfını kullanabilirsiniz. Sıralanmış sonucu belirli sayıda sonuç veya bir anahtar ya da değer aralığına göre de filtreleyebilirsiniz.

Verileri sıralama

Sıralanmış verileri almak için sonuçların nasıl sıralanacağını belirlemek üzere order-by 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. Aynı sorguda bir order-by yöntemini birden çok kez çağırmak hataya neden olur.

Aşağıdaki örnekte, bir kullanıcının yıldız sayısına göre sıralanmış en iyi 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 birleştirildiğinde istemciyi, veritabanındaki yoldan kullanıcının gönderileriyle senkronize eden bir sorguyu tanımlar. Bu işlem, kullanıcının gönderilerini kullanıcı kimliğine göre ve her gönderinin aldığı yıldız sayısına göre sıralayarak gerçekleştirilir. Kimlikleri dizin anahtarı olarak kullanma tekniğine veri dağıtımı 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ı sıralamak için kullanılacak alt anahtarı belirtir. Bu durumda, yayınlar ilgili "starCount" alt öğesinin değerine göre sıralanır. Aşağıdaki gibi verileriniz varsa sorgular 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, metrics anahtarı altında iç içe yerleştirilmiş değerlere göre liste öğelerimizi sıralayabiliriz. Bunun için orderByChild() çağrımızda iç içe yerleştirilmiş alt öğeye giden göreli yolu belirtmemiz gerekir.

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 verileri nasıl sıralanır? 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 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 anahtardan veya değerden büyük ya da bu anahtara veya değere eşit öğeleri döndürür.
startAfter() Sıralama yöntemine bağlı olarak, belirtilen anahtardan veya değerden büyük öğeleri döndürür.
endAt() 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() Sıralama yöntemine bağlı olarak, belirtilen anahtardan veya değerden 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öntemlerinden farklı olarak, 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() işlevini 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ştiğinde, sorguya giren öğeler için child_added, sorgudan çıkan öğeler için child_removed etkinlikleri alırsınız. Böylece toplam sayı 100 olarak kalır.

Aşağıdaki örnekte, örnek blog uygulaması tarafından tüm kullanıcıların en son 100 gönderisinin listesini almak için nasıl bir sorgu tanımlandığı 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 örnek yalnızca bir sorguyu tanımlar. Verilerin gerçekten senkronize edilmesi için eklenmiş bir dinleyiciye sahip olması gerekir.

Anahtara veya değere göre filtreleme

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

Sorgu verilerinin sıralanma şekli

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

orderByChild

orderByChild() kullanılırken belirtilen alt anahtarı içeren veriler şu şekilde sıralanır:

  1. Belirtilen çocuk anahtarı için null değeri olan çocuklar önce gelir.
  2. Belirtilen alt anahtar için false değerine sahip alt öğeler bir sonraki sırada yer alır. Birden fazla alt öğe false değerine sahipse anahtara göre sözlük sırasına göre sıralanır.
  3. Belirtilen alt anahtar için true değerine sahip alt öğeler bir sonraki sırada yer alır. Birden fazla alt öğenin değeri true ise bunlar anahtara göre sözlük sırasına göre sıralanır.
  4. Sayısal değere sahip çocuklar, artan düzende sıralanarak gösterilir. Belirtilen alt düğüm için birden fazla alt öğe aynı sayısal değere sahipse bunlar anahtara göre sıralanır.
  5. Dizeler sayılardan sonra gelir ve sözlük sırasına göre artan düzende sıralanır. Belirtilen alt düğüm için birden fazla alt öğe aynı değere sahipse bunlar anahtara göre sözlük sırasına göre sıralanır.
  6. Nesneler en sona gelir ve anahtara göre artan sözlük sıralamasıyla sıralanır.

orderByKey

Verilerinizi sıralamak için orderByKey() işlevini kullandığınızda veriler, anahtara göre artan düzende döndürülür.

  1. 32 bitlik bir tam sayı olarak ayrıştırılabilen anahtara sahip çocuklar, artan düzende sıralanarak ilk sırada yer alır.
  2. Anahtarı dize değeri olan çocuklar, sözlük sıralamasına göre artan düzende sıralanır.

orderByValue

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

Dinleyicileri ayırma

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

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

Bir ebeveyn dinleyicide off() çağrısı yapılması, alt düğümlerinde kayıtlı dinleyicileri otomatik olarak kaldırmaz. Geri çağırmayı kaldırmak için tüm alt dinleyicilerde de off() çağrısı yapılmalıdır.

Sonraki adımlar