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

Başlayın

Henüz yapmadıysanız önce Get Started rehberine bakın henüz uygulamanızın kurulumunu yapma ve veritabanına erişme işlemlerini yapabilirsiniz.

Veritabanı Referansı Alma

Veritabanı'na veri yazmak için DatabaseReference örneğinin olması gerekir:

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

Verileri Kaydetme

Firebase Realtime Database'e veri yazmak için dört farklı yöntem kullanabilirsiniz:

Yöntem Yaygın kullanım alanları
SetValue() Belirli bir yola veri yazma veya değiştirme (ör. users/<user-id>/<username>
PushChild() Veri listesine ekleme. Her aradığınızda Push(), Firebase, ayrıca kullanılabilecek benzersiz bir anahtar oluşturur benzersiz bir tanımlayıcı olarak, user-scores/<user-id>/<unique-score-id>.
UpdateChildren() Tanımlanan yol için bazı anahtarları, bahsedeceğim.
RunTransaction() Eşzamanlı güncellemelerle bozulabilecek karmaşık verileri güncelleyin.

Bir referanstaki verileri yazma, güncelleme veya silme

Temel yazma işlemleri

Temel yazma işlemleri için SetValue() kullanarak verileri bir bu yoldaki mevcut tüm verilerin yerine geçer. Bunu kullanabilirsiniz aşağıdakilerin desteklendiği bir Varyant türü üzerinden JSON tarafından kabul edilen türlerin iletilmesini sağlayan bir yöntem içerir:

  • Null (bu işlem verileri siler)
  • Tamsayılar (64 bit)
  • Çift duyarlıklı kayan nokta sayıları
  • Boole
  • Dizeler
  • Varyant Vektörleri
  • Dizelerin Varyantlarla haritaları

SetValue() bu şekilde kullanılırsa belirtilen konumdaki verilerin üzerine yazılır. dahildir. Ancak, eğer yoksa çocuklarınız için yeniden yazmanız gerekir. Kullanıcıların profillerini güncellemelerine izin vermek istiyorsanız kullanıcı adını şu şekilde güncelleyebilirsiniz:

dbref.Child("users").Child(userId).Child("username").SetValue(name);

Veri listesine ekle

Çok kullanıcılı uygulamalarda bir listeye veri eklemek için PushChild() yöntemini kullanın. PushChild() yöntemi, yeni bir anahtar oluşturulmasını her seferinde benzersiz bir anahtar alt öğesi, belirtilen Firebase referansına eklenir. Bu araçları kullanarak her yeni öğe için otomatik olarak oluşturulan anahtarlara sahip olduğundan, bazı müşteriler yazma çakışmaları olmadan aynı anda aynı konuma alt öğe ekleme. İlgili içeriği oluşturmak için kullanılan PushChild() tarafından oluşturulan benzersiz anahtar bir zaman damgasına dayalı olduğundan liste öğeleri kronolojik olarak otomatik olarak sıralanır.

PushChild() yöntemi tarafından döndürülen yeni verilere yapılan referansı kullanabilirsiniz alt yayıncının otomatik olarak oluşturulan anahtarın değerini alma veya çocuk için verileri ayarlama. PushChild() referansında GetKey() çağrısı yapıldığında otomatik olarak oluşturulan anahtardır.

Belirli alanları güncelle

Diğer düğümlerin üzerine yazmadan bir düğümün belirli alt öğelerine aynı anda yazmak için alt düğümler için UpdateChildren() yöntemini kullanın.

UpdateChildren() çağrısı yapılırken alt düzey alt değerleri şu şekilde güncelleyebilirsiniz: anahtar için bir yol belirterek. Veriler ölçeklendirilmek üzere birden fazla konumda depolanıyorsa isterseniz, bu verilerin tüm örneklerini verilerin yayılması. Örneğin, oyunda şunun gibi bir LeaderboardEntry sınıfı olabilir:

class LeaderboardEntry {
  std::string uid;
  int score = 0;

 public:
  LeaderboardEntry() {
  }

  LeaderboardEntry(std::string uid, int score) {
    this->uid = uid;
    this->score = score;
  }

  std::map<std::string, Object> ToMap() {
    std::map<string, Variant> result = new std::map<string, Variant>();
    result["uid"] = Variant(uid);
    result["score"] = Variant(score);

    return result;
  }
}

LeaderboardEntry oluşturmak ve aynı anda en son skorla güncellemek için kullanıcının kendi puan listesini çıkarırsanız oyun şu kodu kullanır:

void WriteNewScore(std::string userId, int score) {
  // Create new entry at /user-scores/$userid/$scoreid and at
  // /leaderboard/$scoreid simultaneously
  std::string key = dbref.Child("scores").PushChild().GetKey();
  LeaderBoardEntry entry = new LeaderBoardEntry(userId, score);
  std::map<std::string, Variant> entryValues = entry.ToMap();

  std::map<string, Variant> childUpdates = new std::map<string, Variant>();
  childUpdates["/scores/" + key] = entryValues;
  childUpdates["/user-scores/" + userId + "/" + key] = entryValues;

  dbref.UpdateChildren(childUpdates);
}

Bu örnekte, şunu içeren düğümde bir giriş oluşturmak için PushChild() kullanılmaktadır: /scores/$key alanındaki tüm kullanıcılar için giriş yapar ve anahtarı key(). Bu anahtar, kullanıcının iş sayfasında ikinci bir giriş oluşturmak için kullanılabilir. skor /user-scores/$userid/$key.

Bu yolları kullanarak, bir bölgedeki birden fazla konumda aynı anda güncelleme yapabilirsiniz. tek bir UpdateChildren() çağrısıyla JSON ağacını oluşturabilirsiniz (örneğin, örnek, her iki konumda da yeni girişi oluşturur. Eş zamanlı güncellemeler yapıldı ya tüm güncellemeler başarılı olur ya da başarısız olur.

Verileri silin

Verileri silmenin en basit yolu,RemoveValue() söz konusu verilerin konumu.

Başka bir yazmanın değeri olarak null Variant belirterek de silebilirsiniz SetValue() veya UpdateChildren() gibi bir işlem. Bunu kullanabilirsiniz tek bir API'de birden fazla alt öğeyi silmek için UpdateChildren() ile teknik çağrısına bir tıklama URL'si eklemeniz gerekir.

Verilerinizin kaydedildiği zamanı öğrenin.

Verilerinizin Firebase Realtime Database sunucusuna ne zaman aktarıldığını öğrenmek için Gelecek sonucuna göre düzenlenir.

Verileri işlem olarak kaydet

Eşzamanlı etkenlere göre bozulabilecek verilerle çalışırken artımlı sayaçlar gibi değişiklikleri yapmak için işlemin işleyiş şekli. Bu işleme bir DoTransaction işlevi verirsiniz. Bu güncelleme işlevi bağımsız değişken olarak verilerin mevcut durumunu değiştirir ve istenen yeni durumu döndürür seçin. Başka bir istemci sizden önce konuma yazarsa yeni değer başarıyla yazıldığından, güncelleme fonksiyonunuz değeri gösterilir ve yazma işlemi yeniden denenir.

Örneğin, bir oyunda kullanıcıların bir skor tablosunu en yüksek beş puan:

void AddScoreToLeaders(std::string email,
                       long score,
                       DatabaseReference leaderBoardRef) {
  leaderBoardRef.RunTransaction([](firebase::database::MutableData* mutableData) {
    if (mutableData.children_count() >= MaxScores) {
      long minScore = LONG_MAX;
      MutableData *minVal = null;
      std::vector<MutableData> children = mutableData.children();
      std::vector<MutableData>::iterator it;
      for (it = children.begin(); it != children.end(); ++it) {
        if (!it->value().is_map())
          continue;
        long childScore = (long)it->Child("score").value().int64_value();
        if (childScore < minScore) {
          minScore = childScore;
          minVal = &*it;
        }
      }
      if (minScore > score) {
        // The new score is lower than the existing 5 scores, abort.
        return kTransactionResultAbort;
      }

      // Remove the lowest score.
      children.Remove(minVal);
    }

    // Add the new high score.
    std::map<std::string, Variant> newScoreMap =
      new std::map<std::string, Variant>();
    newScoreMap["score"] = score;
    newScoreMap["email"] = email;
    children.Add(newScoreMap);
    mutableData->set_value(children);
    return kTransactionResultSuccess;
  });
}

Bir işlem kullanmak, birden fazla işlem varsa skor tablosunun yanlış olmasını önler Kullanıcı puanları aynı anda kaydeder ya da müşterinin verileri eskidir. Öğe işlem reddedilirse sunucu geçerli değeri istemciye döndürür. güncel değerle işlemi yeniden çalıştırır. Bu işlem, İşlem kabul edildi veya çok fazla deneme yapıldı.

Çevrimdışı veri yazma

İstemcinin ağ bağlantısı kesilirse uygulamanız çalışmaya devam eder sağlayabilir.

Firebase veritabanına bağlı her istemcinin kendi dahili sürümü bulunur olabilir. Veriler yazıldığında, bu yerel sürüme yazılır. tıklayın. Firebase istemcisi bu verileri uzak veritabanı ile senkronize eder sağlamak için "en iyisini" yaparak .

Sonuç olarak, veritabanına yapılan tüm yazmalar yerel etkinlikleri hemen, sunucuya herhangi bir veri yazıldığından emin olabilirsiniz. Bu, uygulamanızın hızlı bir şekilde yanıt verir.

Bağlantı yeniden kurulduğunda uygulamanız uygun veri kümesini alır Böylece istemcinin, istemcinin bunu gerçekleştirmesine gerek kalmadan mevcut sunucu durumuyla herhangi bir özel kod yazabilirsiniz.

Sonraki adımlar