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

Bu dokümanda, veri almayla ilgili temel bilgiler ile sıralama ve filtreleme açıklanmaktadır. Firebase verileri.

Başlamadan önce

Uygulamanızı kurduğunuzdan ve Get Started rehberini inceleyin.

Veriler Alınıyor

Firebase verileri, GetValue() numaralı telefona tek seferlik bir çağrıyla veya bir ValueListener ekleyerek FirebaseDatabase referansını ekleyebilirsiniz. Değer işleyici, verilerin ilk durumu için bir kez ve veri değişiklikleridir.

Veritabanı Referansı 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 oku

Etiketin statik anlık görüntüsünü okumak için GetValue() yöntemini kullanabilirsiniz. belirli bir yoldaki içeriği bir kez. Görev sonucu, alt veriler dahil olmak üzere bu 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<firebase::database::DataSnapshot> result =
    dbRef.GetReference("Leaders").GetValue();

İstek gönderilmiş olsa da değeri okuyabilmek için Future işlevinin tamamlanmasını beklememiz gerekir. Oyunlar genellikle bir döngü içinde olduğundan uygulamalara göre daha az geri arama odaklıdır. Bu tür uygulamalar teşekkür etmenin de önemli bir yoludur.

  // 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...
    }
  }

Burada, temel hata kontrolleriyle ilgili bilgiler gösterilir. Daha fazla bilgi için firebase::Future referansı hata kontrolü ve sonucun ne zaman hazır olduğunu belirleme yöntemleri hakkında bilgiler içerir.

Etkinlikleri dinleme

Verilerde yapılan değişikliklere abone olacak dinleyiciler ekleyebilirsiniz:

ValueListener temel sınıf

Geri Arama Tipik kullanım
OnValueChanged Bir yolun tüm içeriklerindeki değişiklikleri okuyup dinleyebilirsiniz.

OnChildListener temel sınıf

OnChildAdded Öğe listelerini alma veya öğe listesine eklenen öğeleri dinleme Listelerdeki değişiklikleri izlemek için OnChildChanged ve OnChildRemoved ile birlikte kullanılması önerilir.
OnChildChanged Listedeki öğelerde yapılan değişiklikleri dinleme Şununla kullan: İzlenecek OnChildAdded ve OnChildRemoved listeler.
OnChildRemoved Bir listeden öğelerin kaldırılmasını dinleyin. Şununla kullan: İzlenecek OnChildAdded ve OnChildChanged listeler.
OnChildMoved Sıralı listedeki öğelerin sırasındaki değişiklikleri bekleyin. Öğenin sırasının değişmesi (geçerli sıralama yönteminize göre) nedeniyle OnChildMoved geri çağırma işlevleri her zaman OnChildChanged geri çağırma işlevlerini takip eder.

ValueListener sınıfı

Belirli bir yoldaki içeriklerde yapılan değişikliklere abone olmak için OnValueChanged geri çağırma işlevlerini kullanabilirsiniz. Bu geri çağırma, dinleyici eklendiğinde bir kez ve çocuklar da dahil olmak üzere veriler her değiştiğinde tekrar tetiklenir. Geri çağırma işlevine, alt veriler dahil olmak üzere bu 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 liderlik tablosunun puanlarını aldığı 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<firebase::database::DataSnapshot> result =
    dbRef.GetReference("Leaders").AddValueListener(listener);

Future&ltDataSnapshot&gt sonucu, belirtilen konumdaki verileri içeriyor veri tabanında bulunan yedeklenmiş verileri, Anlık görüntüde value() aranıyor verileri temsil eden bir Variant döndürür.

Bu örnekte, OnCancelled yöntemi de geçersiz kılınır ve okumanın iptal edildi. Örneğin, istemcinin Firebase veritabanı konumundan okuma izni. database::Error, hatanın nedenini belirtin.

ChildListener sınıfı

Alt öğe etkinlikleri, bir işlemden kaynaklanan belirli işlemlere (ör. PushChild() yöntemi aracılığıyla eklenen yeni bir alt öğe veya UpdateChildren() yöntemi aracılığıyla güncellenen bir alt öğe) yanıt olarak tetiklenir. Bunların her biri birlikte projedeki değişiklikleri dinlemek için bir düğümden geliyor. Örneğin, bir oyun, aşağıdaki 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ğırması genellikle öğeleri eklemesi gerekir. OnChildAdded geri çağırma işlevi, mevcut her alt öğe için bir kez ve daha sonra 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.

Bir alt düğüm her değiştirildiğinde OnChildChanged geri çağırması çağrılır. Alt öğelerin alt öğelerinde yapılan tüm değişiklikler de 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. işleyici, çocuk için güncellenmiş verileri içerir.

Şundan birincisi kaldırıldığında OnChildRemoved geri çağırması tetiklenir. Genellikle OnChildAdded ve OnChildChanged geri çağırmalarıyla birlikte kullanılır. Geri çağırma işlevine iletilen anlık görüntü, kaldırılan alt öğenin verilerini içerir.

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

Verileri sıralama ve filtreleme

Verileri sıralama ölçütü olarak almak için Realtime Database Query sınıfını kullanabilirsiniz değerine veya bir alt öğe değerine göre düzenleyebilirsiniz. Mevcut içeriklerinize göre sıralanmış sonucu belirli sayıda sonuç veya anahtar aralığı ya da değerler.

Verileri sırala

Sıralanmış verileri almak için öncelikle sıralamaya göre yöntemlerden birini belirterek sonuçların nasıl sıralandığını belirler:

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 öğ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ı hataya neden olur.

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

  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 müşteriyi veritabanındaki lider tabloyla senkronize eden (her girişin puanına göre sıralanır) bir firebase::Query tanımlar. Verilerinizi verimli bir şekilde yapılandırma hakkında daha fazla bilgiyi Veritabanınızı Yapılandırma başlıklı makalede bulabilirsiniz.

OrderByChild() yönteminin çağrısı, sonuçların sıralanacağı alt anahtarı belirtir. Bu durumda sonuçlar, "score" değerine göre sıralanır. her bir alt öğedeki değere bakacağız. 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 sınır veya aralık yöntemlerinden herhangi birini, yönteme göre sırala.

Yöntem Kullanım
LimitToFirst() Döndürülecek maksimum öğe sayısını sıralı sonuç listesi.
LimitToLast() Siparişin sonundan itibaren iade edilecek maksimum öğe sayısını ayarlar sonuç listesi.
StartAt() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden büyük ya da bu değere eşit öğeleri döndürme
EndAt() Belirtilen anahtar veya değerden düşük veya ona eşit öğeleri döndür seçilen yönteme göre değişir.
EqualTo() Belirtilen anahtara veya değere eşit olan öğeleri döndür seçilen yönteme göre değişir.

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.

Sorgu için tek bir eşleşme olsa bile anlık görüntü hâlâ bir liste, tek bir öğe içeriyor.

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

Belirli bir geri çağırma için senkronize edilecek maksimum çocuk sayısını ayarlamak üzere LimitToFirst() ve LimitToLast() yöntemlerini kullanabilirsiniz. Örneğin, 100'lük bir sınır belirlemek için LimitToFirst() kullanıyorsanız başlangıçta yalnızca en fazla 100 OnChildAdded geri arama. Hesabınızda depoladığınız öğe sayısı 100'den azsa Firebase veritabanını kullanıyorsanız her öğe için bir OnChildAdded geri çağırması tetiklenir.

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

Örneğin, aşağıdaki kod, bir leaderboard'daki en yüksek skoru 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 filtreleme

İsteğe bağlı seçimi yapmak için StartAt(), EndAt() ve EqualTo() kullanabilirsiniz Sorgular için başlangıç, bitiş ve denklik noktaları. 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 sıralama yöntemlerine 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 anahtar için null değerine sahip alt öğeler gelir tıklayın.
  2. Ardından, belirtilen alt anahtar için false değerine sahip alt öğeler gelir. Birden fazla çocuk false değerine sahipse anahtara göre sözlüksel olarak sıralanır.
  3. Ardından, belirtilen alt anahtar için true değerine sahip alt öğeler gelir. Birden fazla alt öğenin değeri true ise bu öğeler anahtara göre alfabetik olarak 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. Dizeler sayılardan sonra gelir ve sözlüksel olarak artan düzende sıralanır. sipariş. 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 son gelir ve anahtara göre artan düzende alfabetik olarak 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. 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, düğümün değerinin belirtilen bir alt anahtarın değeri yerine kullanılır.

Sonraki adımlar