Google is committed to advancing racial equity for Black communities. See how.
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

C ++ için Firebase Gerçek Zamanlı Veritabanı ile Veri Alma

Bu belge, veri almayla ilgili temel bilgileri ve Firebase verilerini nasıl sipariş edeceğinizi ve filtreleyeceğinizi kapsar.

Sen başlamadan önce

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

Verileri Alma

Firebase veriler bir kez çağrı ya tarafından alınır GetValue() ya da takılarak ValueListener bir ilgili FirebaseDatabase referans. Değer dinleyicisi, verilerin ilk durumu için bir kez çağrılır ve veriler her değiştiğinde tekrar çağrılır.

Bir Veritabanı Alın

Veritabanı yazma verisi için, bir örneğini ihtiyaç DatabaseReference :

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

Verileri bir kez okuyun

Belirli bir yoldaki içeriğin statik bir 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çerir. Veri yoksa, döndürülen anlık görüntü null .

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

Bu noktada talep yapıldı, ancak değeri okuyabilmek 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ı güdümlü olduğundan, 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 denetimlerini gösterir, hata denetimi hakkında daha fazla bilgi ve sonucun ne zaman hazır olduğunu belirlemenin yolları için firebase :: Future referansına bakın.

Olayları dinleyin

Verilerdeki değişikliklere abone olmak için dinleyici 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 eklemeler için 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 kullanın.
OnChildRemoved Listeden kaldırılan öğeleri dinleyin. Listelerdeki değişiklikleri izlemek için OnChildAdded ve OnChildChanged ile kullanın.
OnChildMoved Sıralı bir listedeki öğelerin sırasındaki değişiklikleri dinleyin. OnChildMoved geri aramalar daima izleyin OnChildChanged nedeniyle öğenin düzen (mevcut siparişiniz-by yöntemine dayalı) değişen geri aramalar.

ValueListener sınıfı

Belirli bir yoldaki içerik değişikliklerine abone olmak için OnValueChanged geri çağrılarını kullanabilirsiniz. Bu geri arama, dinleyici bağlandığında bir kez ve çocuklar da dahil olmak üzere veriler her değiştiğinde tetiklenir. Geri aramaya, alt konum verileri de dahil olmak üzere o 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 .

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

  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, olay sırasında veritabanında belirtilen konumdaki verileri içerir. Anlık görüntüdeki value() Variant , verileri temsil eden bir Variant döndürür.

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

ChildListener sınıfı

Çocuk olaylar böyle yoluyla eklenen yeni çocuk olarak düzenlenen operasyonda bir düğümün çocukların başına belirli operasyonlarına tepki olarak tetiklenir PushChild() aracılığıyla güncellenmektedir yöntemle veya çocuk UpdateChildren() yöntemiyle. Bunların her biri, bir veritabanındaki belirli bir düğümdeki 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 arama genellikle bir OnChildAdded veritabanındaki öğelerin listesini almak için kullanılır. OnChildAdded geri çağırma, mevcut her bir çocuk için bir kez ve belirtilen yola her yeni çocuk 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 her zaman OnChildChanged geri çağırma çağrılır. Bu, alt düğümün torunları üzerinde yapılan değişiklikleri içerir. Genellikle bir öğe listesindeki değişikliklere yanıt vermek için OnChildRemoved OnChildAdded ve OnChildRemoved çağrılarıyla birlikte kullanılır. Dinleyiciye iletilen anlık görüntü, çocuk için güncellenmiş verileri içerir.

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

OnChildChanged çağrısı, çocuğun yeniden OnChildChanged neden olan bir güncelleme tarafından her yükseltildiğinde OnChildMoved geri çağrısı tetiklenir. OrderByChild veya OrderByValue ile sipariş edilen OrderByChild OrderByValue .

Verileri sıralama ve filtreleme

Anahtar, değere veya bir çocuğun değerine göre sıralanmış verileri almak için Realtime Veritabanı Query sınıfını kullanabilirsiniz. Ayrıca sıralanan sonucu belirli sayıda sonuca veya bir dizi anahtar veya değere filtreleyebilirsiniz.

Verileri sıralama

Sıralanan verileri almak için, sonuçların nasıl sıralandığını belirlemek üzere sipariş yöntemlerinden birini belirleyerek başlayın:

Yöntem kullanım
OrderByChild() Sonuçları belirtilen bir alt anahtarın değerine göre sıralayın.
OrderByKey() Alt anahtarlarla sonuçları sıralayın.
OrderByValue() Sonuçları alt değerlere göre sıralayın.

Bir kerede yalnızca bir sipariş yöntemi kullanabilirsiniz. Aynı sorguda bir sipariş yöntemini birden çok kez çağırmak hata verir.

Aşağıdaki örnek, skora göre sıralanmış bir skor 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 tanımlar ve firebase::Query ile birleştirildiğinde, istemciyi her girişin puanına göre sıralı olarak veritabanındaki skor tablosuyla senkronize eder. Veritabanınızı Yapılandırma bölümünde verilerinizi verimli bir şekilde yapılandırma hakkında daha fazla bilgi edinebilirsiniz.

OrderByChild() yöntemine yapılan çağrı, sonuçları sıralamak için alt anahtarı belirtir. Bu durumda, sonuçlar her alt "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 verilerinin nasıl sıralandığı .

Verilere filtre uygulama

Verilere filtre uygulamak için, bir sorgu oluştururken sınır veya aralık yöntemlerinden herhangi birini sipariş 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 sipariş yöntemine bağlı olarak, belirtilen anahtar veya değere eşit veya daha büyük öğeleri döndürür.
EndAt() Seçilen sipariş yöntemine bağlı olarak, belirtilen anahtar veya değere eşit veya daha küçük öğeleri döndürür.
EqualTo() Seçilen sipariş yöntemine bağlı olarak, belirtilen anahtar veya değere eşit öğeleri döndürür.

Sipariş yöntemlerinden farklı olarak, birden çok limit 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ı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 sınırını ayarlamak için LimitToFirst() kullanırsanız, başlangıçta en fazla 100 OnChildAdded geri çağrı alırsınız. OnChildAdded veritabanınızda 100'den az öğe depolanmışsa, her öğe için bir OnChildAdded geri arama OnChildAdded .

Öğeler değiştikçe, sorguyu OnChildRemoved öğeler için OnChildRemoved geri çağrıları ve OnChildRemoved öğeler için OnChildAdded geri çağrıları alırsınız, böylece toplam sayı 100'de kalır.

Örneğin, aşağıdaki kod bir skor 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 filtreleme

EqualTo() için isteğe bağlı başlangıç, bitiş ve denklik noktaları seçmek üzere StartAt() , EndAt() ve EqualTo() kullanabilirsiniz. Bu, verileri sayfalamak veya belirli bir değere sahip çocuklarla öğeler bulmak için yararlı olabilir.

Sorgu verileri nasıl sipariş edilir?

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 aşağıdaki gibi sıralanır:

  1. Belirtilen çocuk 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 fazla çocuğun false değeri varsa, anahtar sözcüklere göre sözlükbilimsel olarak sıralanır.
  3. Ardından, belirtilen çocuk anahtarı için true değerine sahip çocuklar gelir. Birden çok çocuğun değeri true , anahtar sözcüklere göre sözlükbilimsel olarak sıralanır.
  4. Sayısal değere sahip çocuklar, artan sırada sıralanmış olarak gelir. Birden çok alt öğe, belirtilen alt düğüm için aynı sayısal değere sahipse, bunlar anahtarlarına göre sıralanır.
  5. Dizeler sayılardan sonra gelir ve sözcüklere göre artan sırada sıralanır. Birden çok alt öğe belirtilen alt düğüm için aynı değere sahipse, anahtar sözcükle sözlükbilimsel olarak sıralanır.
  6. Nesneler en sonuncudur ve anahtar kelimelerle artan sırada sıralı olarak sıralanır.

OrderByKey

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

  1. 32 bit tam sayı olarak ayrıştırılabilen bir anahtarı olan çocuklar önce artan düzende sıralanır.
  2. Anahtar olarak dize değerine sahip çocuklar, sözcük sırasına göre artan sırada sıralanır.

OrderByValue

OrderByValue() , çocuklar değerlerine göre sıralanır. Sipariş kriterleri, belirtilen alt anahtarın değeri yerine düğümün değeri kullanılması dışında OrderByChild() ile aynıdır.

Sonraki adımlar