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

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Bu belge, veri almanın temellerini ve Firebase verilerinin nasıl sıralanıp filtreleneceğini kapsar.

Sen başlamadan önce

Uygulamanızı kurduğunuzdan ve Get Started ​​kılavuzunda anlatıldığı gibi veritabanına erişebildiğinizden emin olun.

Veri Alma

Firebase verileri, GetValue() öğesine bir kerelik çağrıyla veya bir FirebaseDatabase referansında bir ValueListener alınır. Değer dinleyicisi, verilerin ilk durumu için bir kez ve veriler değiştiğinde tekrar çağrılır.

Bir Veritabanı Referansı Alın

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 oku

Belirli bir yoldaki içeriğin 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 o konumdaki tüm verileri içeren bir anlık görüntü içerecektir. Veri yoksa, döndürülen anlık görüntü null olur.

  firebase::Future<firebase::database::DataSnapshot> result =
    dbRef.GetReference("Leaders").GetValue();

İsteğin yapıldığı noktada ancak değeri okuyabilmemiz için Geleceğin tamamlanmasını beklememiz gerekiyor. Oyunlar genellikle bir döngüde çalıştığından ve diğer uygulamalardan daha az geri çağrıya yönlendirildiğinden, genellikle tamamlama için anket yaparsınız.

  // 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, bazı temel hata kontrollerini gösterir, hata kontrolü hakkında daha fazla bilgi ve sonucun ne zaman hazır olduğunu belirlemenin yolları için firebase::Future referansına bakın.

Etkinlikleri dinleyin

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

ValueListener temel sınıfı

Geri aramak Tipik kullanım
OnValueChanged Bir yolun tüm içeriğindeki değişiklikleri okuyun ve dinleyin.

OnChildListener temel sınıf

OnChildAdded Öğe listelerini alın veya bir öğe listesine eklemeleri dinleyin. Listelerdeki değişiklikleri izlemek için OnChildChanged ve OnChildRemoved ile önerilen kullanım.
OnChildChanged Listedeki öğelerdeki değişiklikleri dinleyin. Listelerdeki değişiklikleri izlemek için OnChildAdded ve OnChildRemoved ile birlikte kullanın.
OnChildRemoved Listeden kaldırılan öğeleri dinleyin. Listelerdeki değişiklikleri izlemek için OnChildAdded ve OnChildChanged ile birlikte kullanın.
OnChildMoved Sıralı bir listedeki öğelerin sırasına ilişkin değişiklikleri dinleyin. OnChildMoved geri aramaları, öğenin sırasının değişmesi nedeniyle (geçerli sipariş yönteminize göre) her zaman OnChildChanged geri aramalarını takip eder.

ValueListener sınıfı

Belirli bir yoldaki içeriklerde yapılan değişikliklere abone olmak için OnValueChanged geri aramalarını kullanabilirsiniz. Bu geri arama, dinleyici eklendiğinde bir kez ve çocuklar dahil veriler her değiştiğinde yeniden tetiklenir. Geri arama, alt veriler de dahil olmak üzere o konumdaki tüm verileri içeren bir anlık görüntüden geçirilir. Veri yoksa, döndürülen anlık görüntü null olur.

Aşağıdaki örnek, veritabanından bir skor tablosunun puanlarını alan bir oyunu göstermektedir:

  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<firebase::database::DataSnapshot> result =
    dbRef.GetReference("Leaders").AddValueListener(listener);

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

Bu örnekte, okumanın 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 bir okuma iptal edilebilir. database::Error , hatanın neden oluştuğunu gösterecektir.

ChildListener sınıfı

Alt olaylar, PushChild() UpdateChildren() 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. Bunların her biri birlikte, bir veritabanındaki belirli bir düğümde yapılan değişiklikleri dinlemek için yararlı olabilir. Örneğin, bir oyun, aşağıda gösterildiği gibi, bir 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<firebase::database::DataSnapshot> result =
    dbRef.GetReference("GameSessionComments").AddChildListener(listener);

OnChildAdded geri çağrısı, genellikle bir Firebase veritabanındaki öğelerin listesini almak için kullanılır. OnChildAdded geri çağrısı, mevcut her alt öğe için bir kez ve belirtilen yola her yeni bir alt öğe eklendiğinde yeniden çağrılır. Dinleyiciye, yeni çocuğun verilerini içeren bir anlık görüntü iletilir.

Bir alt düğüm değiştirildiğinde OnChildChanged geri çağrısı çağrılır. Bu, alt düğümün alt öğelerinde yapılan tüm değişiklikleri içerir. Öğe listesindeki değişikliklere yanıt vermek için genellikle OnChildAdded ve OnChildRemoved çağrılarıyla birlikte kullanılır. Dinleyiciye iletilen anlık görüntü, alt öğe için güncellenmiş verileri içerir.

OnChildRemoved geri araması, acil bir çocuk kaldırıldığında tetiklenir. Genellikle OnChildAdded ve OnChildChanged geri aramalarıyla birlikte kullanılır. Geri aramaya iletilen anlık görüntü, kaldırılan alt öğenin verilerini içerir.

OnChildMoved geri çağrısı, OnChildChanged çağrısı, alt öğenin yeniden sıralanmasına neden olan bir güncelleştirme tarafından başlatıldığında tetiklenir. OrderByChild veya OrderByValue ile sipariş edilen 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. Ayrıca, sıralanan sonucu belirli sayıda sonuca veya bir dizi anahtar veya değere göre filtreleyebilirsiniz.

Verileri sırala

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

Yöntem kullanım
OrderByChild() Sonuçları belirtilen bir alt anahtarın 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.

Bir seferde yalnızca bir sipariş yöntemi kullanabilirsiniz. Aynı sorguda bir sipariş yönteminin birden çok kez çağrılması bir hata verir.

Aşağıdaki örnek, puana göre sıralanmış bir puan tablosuna nasıl abone olabileceğinizi gösterir.

  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 firebase::Query ile bir ValueListener ile birleştirildiğinde, istemciyi her girişin puanına göre sıralanan veritabanındaki lider tablosuyla senkronize eden bir Firebase::Query tanımlar. Verilerinizi verimli bir şekilde yapılandırma hakkında daha fazla bilgiyi Veritabanınızı Yapılandırın bölümünde okuyabilirsiniz.

OrderByChild() yöntemine yapılan çağrı, sonuçların sıralanacağı alt anahtarı belirtir. Bu durumda, sonuçlar her çocuktaki "score" değerine göre sıralanır. 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, bir sorgu oluştururken sınır veya aralık yöntemlerinden herhangi birini 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 anahtara veya değere eşit veya daha büyük öğeleri döndürün.
EndAt() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değere eşit veya daha küçük öğ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.

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

Sonuç sayısını sınırlayın

Belirli bir geri arama için eşitlenecek maksimum çocuk sayısını ayarlamak için LimitToFirst() ve LimitToLast() yöntemlerini kullanabilirsiniz. Örneğin, 100'lük bir sınır belirlemek için LimitToFirst() 'i kullanırsanız, başlangıçta yalnızca 100'e kadar OnChildAdded geri arama alırsınız. Firebase veritabanınızda depolanan 100'den az öğeniz varsa, her öğe için bir OnChildAdded geri araması tetiklenir.

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

Örneğin, aşağıdaki kod bir lider tablosundan 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.

Anahtar veya değere göre filtrele

Sorgular için rastgele başlangıç, bitiş ve denklik noktaları seçmek için StartAt() , EndAt() ve EqualTo() kullanabilirsiniz. Bu, verileri sayfalandı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üm, verilerin Query sınıfındaki sıralama yöntemlerinin her birine göre nasıl sıralandığını açıklar.

OrderByChild

OrderByChild() kullanılırken, belirtilen alt anahtarı içeren veriler aşağıdaki gibi sıralanır:

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

OrderByKey

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

  1. 32-bit tamsayı olarak ayrıştırılabilen bir anahtarı olan çocuklar, artan düzende sıralanarak önce gelir.
  2. Anahtar olarak dize değerine sahip çocuklar, sözlükbilimsel olarak artan düzende sıralanır.

OrderByValue

OrderByValue() kullanılırken, çocuklar değerlerine göre sıralanır. Sıralama ölçütü, 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