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

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

Başlamak

Bkz Get Started henüz veritabanına uygulamanızı ve erişimi kurmak almadıysanız ilk rehber.

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();

Veri Kaydetme

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

Yöntem Yaygın kullanımlar
SetValue() Yazın veya gibi tanımlanmış bir yola verileri değiştirmek users/<user-id>/<username> .
PushChild() Bir veri listesine ekleyin. Her zaman diyoruz Push() Firebase gibi aynı zamanda benzersiz bir tanımlayıcı olarak kullanılabilen benzersiz bir anahtar oluşturur user-scores/<user-id>/<unique-score-id> .
UpdateChildren() Tüm verileri değiştirmeden tanımlı bir yol için bazı anahtarları güncelleyin.
RunTransaction() Eşzamanlı güncellemeler tarafından bozulabilecek karmaşık verileri güncelleyin.

Bir referansta veri yazın, güncelleyin veya silin

Temel yazma işlemleri

Temel yazma işlemleri için kullanabileceğiniz SetValue() o yolda herhangi mevcut verileri değiştirerek, belirli bir referansa verileri kaydetmek. JSON tarafından kabul edilen türleri aşağıdakileri destekleyen bir Variant türü aracılığıyla iletmek için bu yöntemi kullanabilirsiniz:

  • Null (bu, verileri siler)
  • Tamsayılar (64-bit)
  • Çift duyarlıklı kayan nokta sayıları
  • Boole'ler
  • Teller
  • Varyantların Vektörleri
  • Dizelerin Varyantlarla Eşleştirilmesi

Kullanılması SetValue() bu şekilde tüm alt düğümler dahil belirtilen yerde verileri yazar. Ancak, tüm nesneyi yeniden yazmadan bir alt öğeyi güncelleyebilirsiniz. Kullanıcıların profillerini güncellemelerine izin vermek istiyorsanız, kullanıcı adını aşağıdaki gibi güncelleyebilirsiniz:

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

Veri listesine ekle

Kullanım PushChild() , çok kullanıcılı uygulamalarda listesi verileri eklemek için bir yöntem. PushChild() metodu benzersiz bir anahtar, yeni bir alt belirtilen Firebase referansına eklenen her oluşturur. Listedeki her yeni öğe için bu otomatik oluşturulan anahtarları kullanarak, birkaç istemci, yazma çakışmaları olmadan aynı anda aynı konuma alt öğeler ekleyebilir. Tarafından oluşturulan benzersiz anahtar PushChild() liste öğeleri otomatik kronolojik olarak sıralanır, böylece bir zaman damgası dayanmaktadır.

Sen tarafından döndürülen yeni verilere başvuru kullanabilirsiniz PushChild() çocuk için, çocuğun otomatik oluşturulan anahtar veya ayar verilerinin değerini elde etmek yöntemle. Arayan GetKey() bir ilgili PushChild() referans otomatik oluşturulan anahtar değerini verir.

Belirli alanları güncelle

Aynı anda kullanmak, diğer alt düğümlerin üzerine yazmadan bir düğümün belirli çocuklarına yazmak için UpdateChildren() yöntemini.

Çağrılırken UpdateChildren() , sen anahtarı için bir yolu belirterek düşük seviyede bir alt değerleri güncelleyebilirsiniz. Veri daha iyi ölçekli birden çok yerde saklanıyorsa, kullandığınız verilerin tüm örneklerini güncelleyebilirsiniz veri fan-out . Örneğin, bir oyun olabilir LeaderboardEntry böyle sınıfını:

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;
  }
}

Bir oluşturmak için LeaderboardEntry ve eş zamanlı olarak son puanı yem ve kullanıcının kendi skor listesine güncellemek, oyun Aşağıdaki 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 örnek kullanır PushChild() tüm kullanıcılar için girişlerini içeren düğümünde bir giriş oluşturmak için /scores/$key aynı anda birlikte anahtarı almak key() . Daha sonra anahtar sırasında kullanıcının puanlarında ikinci giriş oluşturmak için kullanılabilir /user-scores/$userid/$key .

Bu yolları kullanarak, tek bir çağrıyla JSON ağacında birden fazla konuma eşzamanlı güncelleştirmeler gerçekleştirebilen UpdateChildren() böyle bu örnek her iki konumda da yeni bir giriş oluşturur nasıl gibi. Bu şekilde yapılan eşzamanlı güncellemeler atomiktir: ya tüm güncellemeler başarılı olur ya da tüm güncellemeler başarısız olur.

Verileri sil

Silme verilere en basit yolu aramaktır RemoveValue() bu verilerin konumun referansı üzerine.

Ayrıca belirterek silebilirsiniz null Variant gibi başka yazma işlemi için değer olarak SetValue() veya UpdateChildren() . Sen ile bu tekniği kullanabilirsiniz UpdateChildren() tek bir API çağrısında birden fazla çocuk silmek için.

Verilerinizin ne zaman işlendiğini bilin.

Veri Firebase Gerçek zamanlı Veritabanı sunucusuna kararlıdır zaman bilmek için, kontrol Gelecek başarısı için sonuç.

Verileri işlem olarak kaydedin

Böyle sayıcı olarak eşzamanlı değişiklikler, tarafından bozulmuş olabilir verilerle çalışırken, bir kullanabilir işlem operasyonu . Bu işlemi bir vermek DoTransaction işlevi. Bu güncelleme işlevi, verilerin mevcut durumunu bir argüman olarak alır ve yazmak istediğiniz yeni istenen durumu döndürür. Yeni değeriniz başarıyla yazılmadan önce başka bir istemci konuma yazarsa, güncelleme işleviniz yeni geçerli değerle tekrar çağrılır ve yazma işlemi yeniden denenir.

Örneğin, bir oyunda kullanıcıların en yüksek beş puana sahip bir skor tablosunu güncellemesine izin verebilirsiniz:

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şlemin kullanılması, birden fazla kullanıcının aynı anda puan kaydetmesi veya müşterinin eski verileri olması durumunda skor tablosunun yanlış olmasını önler. İşlem reddedilirse, sunucu, işlemi güncellenen değerle yeniden çalıştıran istemciye mevcut değeri döndürür. Bu, işlem kabul edilene veya çok fazla deneme yapılana kadar tekrarlanır.

Verileri çevrimdışı yaz

Bir istemci ağ bağlantısını kaybederse uygulamanız düzgün şekilde çalışmaya devam eder.

Bir Firebase veritabanına bağlanan her istemci, herhangi bir etkin verinin kendi dahili sürümünü tutar. Veri yazıldığında, önce bu yerel sürüme yazılır. Firebase istemcisi daha sonra bu verileri uzak veritabanı sunucuları ve diğer istemcilerle "en iyi çaba" temelinde senkronize eder.

Sonuç olarak, veritabanına yapılan tüm yazma işlemleri, sunucuya herhangi bir veri yazılmadan hemen önce yerel olayları tetikler. Bu, uygulamanızın ağ gecikmesinden veya bağlantıdan bağımsız olarak yanıt vermeye devam edeceği anlamına gelir.

Bağlantı yeniden kurulduğunda, uygulamanız uygun olay kümesini alır, böylece istemci herhangi bir özel kod yazmak zorunda kalmadan mevcut sunucu durumuyla eşitlenir.

Sonraki adımlar