Save the date - Google I/O returns May 18-20. Register to get the most out of the digital experience: Build your schedule, reserve space, participate in Q&As, earn Google Developer profile badges, and more. Register now
Bu sayfa, Cloud Translation API ile çevrilmiştir.
Switch to English

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

Bu belgede, verilerin alınmasıyla ilgili temel bilgiler ve Firebase verilerinin nasıl sıralanacağı ve filtreleneceği anlatılmaktadır.

Sen başlamadan önce

Uygulamanızı kurduğunuzdan ve veritabanına Get Started kılavuzunda Get Started gibi 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 dinleyici, verilerin ilk durumu için bir kez ve veriler her değiştiğinde yeniden çağrılır.

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

  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ı beklemeliyiz. Oyunlar tipik olarak bir döngü içinde çalıştığından ve diğer uygulamalardan daha az geri çağrı odaklı olduğundan, genellikle tamamlanma 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 için firebase :: Future referansına ve sonucun ne zaman hazır olduğunu belirleme yollarına bakın.

Olayları dinleyin

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

ValueListener temel sınıfı

Geri çağırmak 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 yapılan eklemeleri dinleyin. Listelerdeki değişiklikleri izlemek için OnChildChanged ve OnChildRemoved ile önerilen kullanım.
OnChildChanged Bir listedeki öğelerde yapılan 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ı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çeriklerde değişikliklere abone olmak için OnValueChanged geri aramalarını kullanabilirsiniz. Bu geri arama, dinleyici eklendiğinde bir kez ve çocuklar da dahil olmak üzere veriler her değiştiğinde tetiklenir. Geri arama, alt veriler 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 .

Aşağıdaki örnek, veritabanından bir skor tablosunun puanlarını 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. Bir anlık görüntüde value() çağırmak, 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 bir okuma iptal edilebilir. database::Error , hatanın neden oluştuğunu gösterecektir.

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 OnChildAdded genellikle bir OnChildAdded veritabanındaki bir öğe listesini almak için kullanılır. OnChildAdded geri çağrısı, her bir mevcut çocuk için bir kez ve ardından, 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ü aktarılır.

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

OnChildRemoved geri OnChildRemoved , bir alt OnChildRemoved kaldırıldığında tetiklenir. Genellikle OnChildAdded ve OnChildChanged geri OnChildAdded birlikte kullanılır. Geri aramaya aktarılan anlık görüntü, kaldırılan çocuğun verilerini içerir.

OnChildMoved geri araması, alt OnChildChanged yeniden OnChildChanged neden olan bir güncelleştirme tarafından OnChildChanged çağrısı her başlatıldığında tetiklenir. OrderByChild veya OrderByValue ile sipariş edilen OrderByChild OrderByValue .

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 ya da değere göre filtreleyebilirsiniz.

Verileri sırala

Sıralanmış verileri almak için, sonuçların nasıl sıralanacağı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 oluşturur.

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 tanımlar firebase::Query bir ile birleştirilmesi durumunda ValueListener her girişin skorla tarafından sipariş veritabanında liderlik ile müşteri eşitler. 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ıralama OrderByChild() sıralamak için alt anahtarı belirtir. Bu durumda sonuçlar, her çocuktaki "score" değerinin 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 sipariş yöntemi ile 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 anahtara veya değere eşit veya ondan büyük öğeleri döndürür.
EndAt() Seçilen sıraya göre yönteme bağlı olarak belirtilen anahtara veya değere eşit veya ondan küçük öğeleri döndür.
EqualTo() Seçilen sipariş yöntemine bağlı olarak belirtilen anahtara veya değere eşit öğeler döndürür.

Sıralama yöntemlerinden farklı olarak, birden çok sınır veya aralık işlevini birleştirebilirsiniz. Örneğin, sonuçları belirli bir değer aralığıyla sınırlandırmak için StartAt() ve EndAt() yöntemlerini birleştirebilirsiniz.

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

Sonuç sayısını sınırlandırın

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

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

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

Anahtar veya değere göre filtreleyin

EqualTo() 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ümde verilerin, Query sınıfındaki sıralama yöntemlerinin her birine 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 alt anahtar için null değeri olan çocuklar önce gelir.
  2. Ardından, belirtilen alt anahtar için false değerine sahip çocuklar gelir. Birden fazla çocuk false değerine sahipse, bunlar sözlükbilimsel olarak anahtara göre sıralanır.
  3. Ardından, belirtilen alt anahtar için true değerine sahip çocuklar gelir. Birden çok alt öğe true değerine sahipse, bunlar sözlükbilimsel olarak anahtara göre sıralanır.
  4. Sırada sayısal değeri olan çocuklar artan sırada 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 sırada sıralanır. Birden çok çocuk belirtilen alt düğüm için aynı değere sahipse, bunlar sözlükbilimsel olarak anahtarla sıralanır.
  6. Nesneler en son gelir ve artan sırada anahtara göre sözlükbilimsel olarak sıralanır.

OrderByKey

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

  1. 32 bitlik tamsayı olarak ayrıştırılabilen bir anahtara sahip çocuklar önce gelir, artan sırada sıralanır.
  2. Sırada anahtar olarak bir dize değeri olan çocuklar sözlükbilimsel olarak artan sırada sıralanır.

OrderByValue

OrderByValue() , çocuklar 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