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

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Başlamak

Henüz uygulamanızı ayarlamadıysanız ve veritabanına Get Started , başlangıç ​​kılavuzuna bakın.

Bir Veritabanı Referansı Alın

DatabaseReference veri yazmak için bir DatabasEREERENERICE örneğine ihtiyacınız var:

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

Veri Kaydetme

Firebase RealTime veritabanına veri yazmak için dört yöntem vardır:

Yöntem Yaygın kullanımlar
SetValue() users/<user-id>/<username> gibi tanımlanmış bir yola verileri yazın veya değiştirin.
PushChild() Bir veri listesine ekleyin. Push() öğesini her çağırdığınızda, Firebase, user-scores/<user-id>/<unique-score-id> gibi benzersiz bir tanımlayıcı olarak da kullanılabilen benzersiz bir anahtar oluşturur.
UpdateChildren() Tüm verileri değiştirmeden tanımlanmış bir yol için bazı anahtarları güncelleyin.
RunTransaction() Eşzamanlı güncellemelerle 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, belirli bir referansa veri kaydetmek için SetValue() 'yi kullanabilirsiniz ve bu yoldaki mevcut tüm verileri değiştirebilirsiniz. Bu yöntemi, JSON tarafından kabul edilen türleri destekleyen bir varyant türünden geçmek için 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

SetValue() 'nin bu şekilde kullanılması, herhangi bir alt düğüm de dahil olmak üzere, belirtilen konumdaki verilerin üzerine 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

Çok kullanıcılı uygulamalarda bir listeye veri eklemek için PushChild() yöntemini kullanın. PushChild() yöntemi, belirtilen Firebase referansına her yeni bir alt öğe eklendiğinde benzersiz bir anahtar 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. PushChild() tarafından oluşturulan benzersiz anahtar bir zaman damgasını temel alır, bu nedenle liste öğeleri otomatik olarak kronolojik olarak sıralanır.

Çocuğun otomatik olarak oluşturulan anahtarının değerini almak veya çocuk için veri ayarlamak için PushChild() yöntemi tarafından döndürülen yeni verilere başvuruyu kullanabilirsiniz. Bir PushChild() başvurusunda GetKey() GetKey() çağrılması, otomatik olarak oluşturulan anahtarın değerini döndürür.

Belirli alanları güncelle

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

UpdateChildren() çağırırken, anahtar için bir yol belirterek alt düzey alt değerleri güncelleyebilirsiniz. Daha iyi ölçeklendirmek için veriler birden fazla yerde depolanıyorsa, veri yayma özelliğini kullanarak bu verilerin tüm örneklerini güncelleyebilirsiniz. Örneğin, bir oyun şuna benzer bir LeaderboardEntry sınıfına sahip 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;
  }
}

Bir LeaderboardEntry oluşturmak ve bunu aynı anda en son puan akışına ve kullanıcının kendi puan listesine güncellemek için 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, /scores/$key konumundaki tüm kullanıcılar için girişleri içeren düğümde bir giriş oluşturmak ve aynı anda key() ile key() almak için PushChild() 'i kullanır. Anahtar daha sonra, /user-scores/$userid/$key puanlarında ikinci bir giriş oluşturmak için kullanılabilir.

Bu yolları kullanarak, bu örneğin her iki konumda yeni girişi nasıl oluşturduğu gibi, UpdateChildren() tek bir çağrıyla JSON ağacındaki birden çok konumda eşzamanlı güncellemeler gerçekleştirebilirsiniz. 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

Verileri silmenin en basit yolu, o verinin konumuna bir başvuruda RemoveValue() çağırmaktır.

SetValue() veya UpdateChildren() gibi başka bir yazma işlemi için değer olarak null bir Variant belirleyerek de silebilirsiniz. Tek bir API çağrısında birden çok çocuğu silmek için UpdateChildren() ile bu tekniği kullanabilirsiniz.

Verilerinizin ne zaman işlendiğini bilin.

Verilerinizin Firebase Realtime Database sunucusuna ne zaman kaydedildiğini öğrenmek için, Başarı için Gelecek sonucunu kontrol edin.

Verileri işlem olarak kaydedin

Artımlı sayaçlar gibi eşzamanlı değişikliklerle bozulabilecek verilerle çalışırken, bir işlem işlemi kullanabilirsiniz. Bu işleme bir DoTransaction işlevi veriyorsunuz. 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