Catch up on everthing we announced at this year's Firebase Summit. Learn more

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

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

Sen başlamadan önce

Emin olduğunuz kurulum, uygulama yapın ve kaplı olarak veritabanına erişebilir Get Started kılavuzuna.

Veri 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 ve veriler değiştiğinde tekrar çağrılır.

Bir 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

Sen kullanabilirsiniz GetValue() bir kez belirli bir yol üstündeki içindekiler statik anlık okunması yöntemi. Görev sonucu, alt veriler de dahil olmak üzere o konumdaki tüm verileri içeren bir anlık görüntü içerecektir. Hiçbir veri yoksa, iade anlık görüntüsüdür 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ı 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 gösterileri bazı temel hata denetimi, bkz Firebase :: Gelecek hata kontrolü konusunda daha fazla bilgi için referans ve sonuç hazır olduğunu belirlemek için yollar.

Etkinlikleri dinleyin

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

ValueListener taban 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. İle Önerilen Kullanım OnChildChanged ve OnChildRemoved listelere değişiklikleri izlemek için.
OnChildChanged Listedeki öğelerdeki değişiklikleri dinleyin. İle kullan OnChildAdded ve OnChildRemoved listelere değişiklikleri izlemek için.
OnChildRemoved Listeden kaldırılan öğeleri dinleyin. İle kullan OnChildAdded ve OnChildChanged listelerine monitör değişikliklerine.
OnChildMoved Sıralı bir listedeki öğelerin sırasına ilişkin 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ı

Sen kullanabilirsiniz OnValueChanged belirli bir yolda içeriğine değişikliklerine abone geri aramalar. 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. Hiçbir veri yoksa, iade anlık görüntüsüdür null .

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 sonuç etkinliği sırasında veri tabanında belirli bir konumda verileri içerir. Arayan value() anlık geri döner bir ilgili Variant verileri temsil eder.

Bu örnekte, OnCancelled yöntem aynı zamanda okuma iptal olup olmadığını görmek için geçersiz kılınır. Örneğin, istemcinin bir Firebase veritabanı konumundan okuma izni yoksa bir okuma iptal edilebilir. database::Error hatası oluştu neden 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 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 arama tipik bir Firebase veritabanındaki öğelerin listesini almak için kullanılır. OnChildAdded geri arama yeni bir çocuk belirtilen yoluna eklenen her zaman sonra tekrar mevcut her çocuk için bir kez adlandırılırlar. Dinleyiciye, yeni çocuğun verilerini içeren bir anlık görüntü iletilir.

OnChildChanged geri arama Bir çocuk düğüm değiştirildiğinde her zaman denir. Bu, alt düğümün alt öğelerinde yapılan tüm değişiklikleri içerir. Genellikle ile birlikte kullanılır OnChildAdded ve OnChildRemoved öğelerin bir listesini değişikliklere yanıt verdiklerini aramalar. Dinleyiciye iletilen anlık görüntü, alt öğe için güncellenmiş verileri içerir.

OnChildRemoved Bir alt düzey kaldırıldığında geri arama tetiklenir. Bu, tipik olarak birlikte kullanılır OnChildAdded ve OnChildChanged geri aramalar. Geri aramaya iletilen anlık görüntü, kaldırılan alt öğenin verilerini içerir.

OnChildMoved zaman geri arama tetiklenir OnChildChanged çağrı çocuğun yeniden düzenlenmesi neden olur güncelleme ile yükseltilir. Bu şekilde sıralanır verilerle birlikte kullanılır OrderByChild veya OrderByValue .

Verileri sıralama ve filtreleme

Sen Gerçek Zamanlı Veri Tabanı kullanabilirsiniz Query değeri ile, anahtar ile sıralanmış verileri almak için sınıf veya bir çocuğun değeri ile. 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.

Yalnızca bir seferde yöntemle sırasını-birini 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 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. İçeri verimli veri yapılandırma hakkında daha fazla bilgi bulabilirsiniz Yapısı Kişisel Veritabanı .

Çağrı OrderByChild() metodu ile sonuçlarını sipariş çocuk anahtarını belirtir. Bu durumda, sonuç değeri göre sıralanır "score" Her çocukta değer. Diğer veri türleri sıralanır konusunda daha fazla bilgi için bkz sorgu veri sipariş nasıl .

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, birleştirebilirsiniz StartAt() ve EndAt() değerlerinin belirli bir aralıkla sonuçlarını sınırlandırmak için yöntemler.

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

Sen kullanabilirsiniz LimitToFirst() ve LimitToLast() verilen bir geri arama için senkronize edilmesini çocukların maksimum sayısını ayarlamak için yöntemler. Örneğin, kullanmak durumunda LimitToFirst() 100 sınırlamak için kullanın, başlangıçta sadece 100 kadar almak OnChildAdded geri aramaları. Eğer Firebase veritabanı, bir saklanan 100'den az öğeler varsa OnChildAdded her öğe için geri arama yangınlar.

Ürün değiştirmek gibi, elde OnChildAdded sorgu ve girmek öğeler için geri aramalar OnChildRemoved 100'de yüzden o toplam sayısı kalır terk öğeler için geri aramalar.

Ö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

Sen kullanabilirsiniz StartAt() , EndAt() ve EqualTo() sorguları için keyfi biten başlangıç, ve denklik noktalarını seçin. 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 Veri amacıyla-by yöntemlerin her göre sıralanır açıklar Query sınıfı.

OrderByChild

Kullanırken OrderByChild() , aşağıdaki gibi belirtilen çocuk anahtar sıralanır içerdiği verileri:

  1. Bir olan çocuklar null belirtilen çocuk anahtarı için değer önce gelir.
  2. Değeriyle Çocuklar false belirtilen çocuk anahtarı için bir sonraki gelir. Birden çocuklar değeri varsa false , bunlar sıralanır sözlük sırasında anahtar ile.
  3. Değerinde olan çocuklar true belirtilen çocuk anahtarı için bir sonraki gelir. Birden çocukların bir değeri varsa true , bunlar anahtar ile leksikografik 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

Kullanırken OrderByKey() veri sıralamak için, veri anahtar ile artan düzende 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

Kullanırken OrderByValue() , çocukların değerinden göre sıralanır. Sipariş kriterleri ile aynıdır OrderByChild() düğümünün değeri yerine belirli bir çocuk anahtarının değeri kullanılır hariç.

Sonraki adımlar