C++ için Firebase Realtime Database ile Veri Alma

Bu belgede, veri alma ve Firebase verilerini sıralayıp filtreleme ile ilgili temel bilgiler ele alınmaktadır.

Başlamadan önce

Uygulamanızı ayarladığınızdan ve Get Started kılavuzunda açıklandığı şekilde veritabanına erişebildiğinizden emin olun.

Veriler alınıyor

Firebase verileri, GetValue() için tek seferlik bir çağrı yapılarak veya FirebaseDatabase referansındaki bir ValueListener öğesine eklenerek alınır. Değer dinleyici, verilerin ilk durumu için bir kez ve veriler her değiştiğinde tekrar çağrılır.

DatabaseReference alma

Veritabanına veri yazmak için bir DatabaseReference örneğine ihtiyacınız vardır:

    // Get the root reference location of the database.
    firebase::database::DatabaseReference dbref = database->GetReference();

Verileri bir kez okuma

Belirli bir yoldaki içeriklerin statik anlık görüntüsünü bir kez okumak için GetValue() yöntemini kullanabilirsiniz. Görev sonucu, alt veriler de dahil olmak üzere ilgili konumdaki tüm verileri içeren bir anlık görüntü içerir. Veri yoksa döndürülen anlık görüntü null olur.

  firebase::Future&ltfirebase::database::DataSnapshot&gt result =
    dbRef.GetReference("Leaders").GetValue();

İstek yapıldı ancak değeri okuyabilmemiz için Future'ın tamamlanmasını beklememiz gerekiyor. Oyunlar genellikle bir döngü içinde çalıştığından ve diğer uygulamalara kıyasla daha az geri çağırma odaklı olduğundan, genellikle tamamlanma durumunu sorgulamanız gerekir.

  // In the game loop that polls for the result...

  if (result.status() != firebase::kFutureStatusPending) {
    if (result.status() != firebase::kFutureStatusComplete) {
      LogMessage("ERROR: GetValue() returned an invalid result.");
      // Handle the error...
    } else if (result.error() != firebase::database::kErrorNone) {
      LogMessage("ERROR: GetValue() returned error %d: %s", result.error(),
                 result.error_message());
      // Handle the error...
    } else {
      firebase::database::DataSnapshot snapshot = result.result();
      // Do something with the snapshot...
    }
  }

Bu örnekte bazı temel hata kontrolleri gösterilmektedir. Hata kontrolü ve sonucun ne zaman hazır olduğunu belirleme yöntemleri hakkında daha fazla bilgi için firebase::Future referansına bakın.

Etkinlikleri dinleme

Verilerdeki değişikliklere abone olmak için dinleyiciler ekleyebilirsiniz:

ValueListener temel sınıfı

Geri Arama Tipik kullanım
OnValueChanged Bir yolun tüm içeriğindeki değişiklikleri okuma ve dinleme.

OnChildListener temel sınıfı

OnChildAdded Öğe listelerini alma veya öğe listesine eklenenleri dinleme Listelerdeki değişiklikleri izlemek için OnChildChanged ve OnChildRemoved ile birlikte kullanılması önerilir.
OnChildChanged Bir listedeki öğelerde yapılan değişiklikleri dinleme. Listelerdeki değişiklikleri izlemek için OnChildAdded ve OnChildRemoved ile birlikte kullanın.
OnChildRemoved Listeden kaldırılan öğeleri dinleme Listelerdeki değişiklikleri izlemek için OnChildAdded ve OnChildChanged ile birlikte kullanın.
OnChildMoved Sıralı listedeki öğelerin sırasındaki değişiklikleri dinleme Öğenin sırası değiştiği için (mevcut sıralama yönteminize göre) OnChildMoved geri çağırmaları her zaman OnChildChanged geri çağırmalarından sonra gelir.

ValueListener sınıfı

Belirli bir yoldaki içeriklerde yapılan değişikliklere abone olmak için OnValueChanged geri çağırmalarını kullanabilirsiniz. Bu geri çağırma, dinleyici eklendiğinde bir kez ve alt öğeler de dahil olmak üzere veriler her değiştiğinde tekrar tetiklenir. Geri çağırma işlevine, alt veriler de dahil olmak üzere ilgili konumdaki tüm verileri içeren bir anlık görüntü iletilir. Veri yoksa döndürülen anlık görüntü null olur.

Aşağıdaki örnekte, bir oyunun veritabanından skor tablosu puanlarını alma işlemi gösterilmektedir:

  class LeadersValueListener : public firebase::database::ValueListener {
   public:
    void OnValueChanged(
        const firebase::database::DataSnapshot& snapshot) override {
      // Do something with the data in snapshot...
    }
    void OnCancelled(const firebase::database::Error& error_code,
                     const char* error_message) override {
      LogMessage("ERROR: LeadersValueListener canceled: %d: %s", error_code,
                 error_message);
    }
  };

  // Elsewhere in the code...

  LeadersValueListener* listener = new LeadersValueListener();
  firebase::Future&ltfirebase::database::DataSnapshot&gt result =
    dbRef.GetReference("Leaders").AddValueListener(listener);

Future&ltDataSnapshot&gt sonucu, etkinlik sırasında veritabanında belirtilen konumdaki verileri içerir. Bir anlık görüntüde value() çağrıldığında verileri temsil eden bir Variant döndürülür.

Bu örnekte, okuma işleminin iptal edilip edilmediğini görmek için OnCancelled yöntemi de geçersiz kılınmıştır. Örneğin, istemcinin bir Firebase veritabanı konumundan okuma izni yoksa okuma işlemi iptal edilebilir. database::Error, hatanın nedenini gösterir.

ChildListener sınıfı

Alt etkinlikler, bir düğümün alt öğelerinde gerçekleşen belirli işlemlere yanıt olarak tetiklenir. Örneğin, PushChild() yöntemiyle yeni bir alt öğe eklenmesi veya UpdateChildren() yöntemiyle bir alt öğenin güncellenmesi gibi. Bunların her biri, bir veritabanındaki belirli bir düğümde yapılan değişiklikleri dinlemek için yararlı olabilir. Örneğin, bir oyun, oyun oturumunun yorumlarındaki etkinliği izlemek için bu yöntemleri birlikte kullanabilir:

  class SessionCommentsChildListener : public firebase::database::ChildListener {
   public:
    void OnChildAdded(const firebase::database::DataSnapshot& snapshot,
                      const char* previous_sibling) override {
      // Do something with the data in snapshot ...
    }
    void OnChildChanged(const firebase::database::DataSnapshot& snapshot,
                        const char* previous_sibling) override {
      // Do something with the data in snapshot ...
    }
    void OnChildRemoved(
        const firebase::database::DataSnapshot& snapshot) override {
      // Do something with the data in snapshot ...
    }
    void OnChildMoved(const firebase::database::DataSnapshot& snapshot,
                      const char* previous_sibling) override {
      // Do something with the data in snapshot ...
    }
    void OnCancelled(const firebase::database::Error& error_code,
                     const char* error_message) override {
      LogMessage("ERROR: SessionCommentsChildListener canceled: %d: %s",
                 error_code, error_message);
    }
  };

  // elsewhere ....

  SessionCommentsChildListener* listener = new SessionCommentsChildListener();
  firebase::Future&ltfirebase::database::DataSnapshot&gt result =
    dbRef.GetReference("GameSessionComments").AddChildListener(listener);

OnChildAdded geri çağırma işlevi genellikle Firebase veritabanındaki öğelerin listesini almak için kullanılır. OnChildAdded geri çağırma işlevi, mevcut her alt öğe için bir kez ve ardından belirtilen yola her yeni alt öğe eklendiğinde tekrar çağrılır. Dinleyiciye, yeni alt öğenin verilerini içeren bir anlık görüntü iletilir.

OnChildChanged geri çağırma işlevi, bir alt düğüm her değiştirildiğinde çağrılır. Alt düğümün alt öğelerinde yapılan tüm değişiklikler buna dahildir. Genellikle bir öğe listesindeki değişikliklere yanıt vermek için OnChildAdded ve OnChildRemoved çağrılarıyla birlikte kullanılır. Dinleyiciye iletilen anlık görüntü, alt öğenin güncellenmiş verilerini içerir.

OnChildRemoved geri çağırma işlevi, doğrudan alt öğe kaldırıldığında tetiklenir. Genellikle OnChildAdded ve OnChildChanged geri çağırmalarıyla birlikte kullanılır. Geri çağırmaya iletilen anlık görüntü, kaldırılan alt öğenin verilerini içerir.

OnChildMoved geri çağırma işlevi, alt öğenin yeniden sıralanmasına neden olan bir güncelleme tarafından OnChildChanged çağrısı yapıldığında tetiklenir. OrderByChild veya OrderByValue ile sıralanan verilerle kullanılır.

Verileri sıralama ve filtreleme

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

Verileri sıralama

Sıralanmış verileri almak için öncelikle sonuçların nasıl sıralanacağını belirlemek üzere sıralama yöntemlerinden birini belirtin:

Yöntem Kullanım
OrderByChild() Sonuçları, belirtilen bir alt anahtarın değerine göre sıralar.
OrderByKey() Sonuçları alt anahtarlara göre sıralar.
OrderByValue() Sonuçları alt değerlere göre sıralar.

Aynı anda yalnızca bir sıralama yöntemi kullanabilirsiniz. Aynı sorguda bir sıralama yöntemini birden çok kez çağırmak hataya neden olur.

Aşağıdaki örnekte, puana göre sıralanmış bir skor tablosuna nasıl abone olabileceğiniz gösterilmektedir.

  firebase::database::Query query =
    dbRef.GetReference("Leaders").OrderByChild("score");

  // To get the resulting DataSnapshot either use query.GetValue() and poll the
  // future, or use query.AddValueListener() and register to handle the
  // OnValueChanged callback.

Bu, bir ValueListener ile birleştirildiğinde istemciyi veritabanındaki skor tablosuyla senkronize eden ve her girişin puanına göre sıralayan bir firebase::Query tanımlar. Verilerinizi verimli bir şekilde yapılandırma 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 sonuçlar, her alt öğedeki "score" değerine göre sıralanır. 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 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 anahtardan veya değerden büyük ya da ona eşit olan öğeleri döndürür.
EndAt() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değere eşit ya da ondan 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öntemlerinin aksine, 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.

Sorgu için yalnızca tek bir eşleşme olsa bile anlık görüntü yine de bir listedir; yalnızca tek bir öğe içerir.

Sonuç sayısını sınırlama

Belirli bir geri çağırma için senkronize edilecek maksimum alt öğe sayısını ayarlamak üzere LimitToFirst() ve LimitToLast() yöntemlerini kullanabilirsiniz. Örneğin, LimitToFirst() kullanarak 100 sınırı belirlerseniz başlangıçta yalnızca en fazla 100 OnChildAdded geri çağırma alırsınız. Firebase veritabanınızda 100'den az öğe varsa her öğe için bir OnChildAdded geri çağırma işlevi tetiklenir.

Öğeler değiştikçe sorguya giren öğeler için OnChildAdded geri çağırma, sorgudan çıkan öğeler için OnChildRemoved geri çağırma alırsınız. Böylece toplam sayı 100'de kalır.

Örneğin, aşağıdaki kod bir skor tablosundaki en yüksek puanı döndürür:

  firebase::database::Query query =
    dbRef.GetReference("Leaders").OrderByChild("score").LimitToLast(1);

  // To get the resulting DataSnapshot either use query.GetValue() and poll the
  // future, or use query.AddValueListener() and register to handle the
  // OnValueChanged callback.

Anahtara veya değere göre filtrele

Sorgular için rastgele başlangıç, bitiş ve eşdeğerlik noktaları seçmek üzere StartAt(), EndAt() 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ıralanma şekli

Bu bölümde, verilerin Query sınıfındaki sıralama yöntemlerinin her biri tarafından 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 alt öğenin değeri false ise anahtara göre sözlük düzeninde sıralanırlar.
  3. Belirtilen alt anahtar için true değerine sahip alt öğeler sonra gelir. Birden fazla alt öğenin değeri true ise bunlar anahtara göre alfabetik olarak sıralanır.
  4. Ardından, sayısal değere sahip alt öğeler artan düzende sıralanır. 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 düzeninde 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 düzeninde sıralanır.
  6. Nesneler en sonda yer alır ve anahtara göre alfabetik olarak 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 bit tam sayı olarak ayrıştırılabilen bir anahtara sahip alt öğeler, artan düzende sıralanarak ilk sırada yer alır.
  2. Ardından, anahtarı dize değeri olan alt öğeler, alfabetik 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, belirtilen bir alt anahtarın değeri yerine düğümün değerinin kullanılması dışında OrderByChild() ile aynıdır.

Sonraki adımlar