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 Kaydetme

Başlamak

Henüz uygulamanızı kurmadıysanız ve veritabanına Get Started önce Get Started kılavuzuna bakın.

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 Kaydetme

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

Yöntem Ortak kullanımlar
SetValue() users/<user-id>/<username> gibi tanımlı bir yola veri yazın veya değiştirin.
PushChild() Bir veri listesine ekleyin. Push() 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 belirli 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, verileri belirtilen bir referansa kaydetmek için SetValue() , o yoldaki mevcut verileri değiştirerek kullanabilirsiniz. JSON tarafından kabul edilen türleri aşağıdakileri destekleyen bir Değişken türü aracılığıyla geçirmek için bu yöntemi kullanabilirsiniz:

  • Null (bu, verileri siler)
  • Tamsayılar (64-bit)
  • Çift hassasiyetli kayan noktalı sayılar
  • Boole'lar
  • Teller
  • Varyantların Vektörleri
  • Varyantlara dizelerin haritaları

SetValue() bu şekilde kullanılması, tüm alt düğümler dahil olmak üzere belirtilen konumdaki verilerin üzerine yazar. Ancak, tüm nesneyi yeniden yazmadan bir çocuğu yine de güncelleyebilirsiniz. Kullanıcıların profillerini güncellemelerine izin vermek istiyorsanız, kullanıcı adını aşağıdaki şekilde güncelleyebilirsiniz:

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

Bir veri listesine ekleyin

Ç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 alt PushChild() benzersiz bir anahtar oluşturur. Listedeki her yeni öğe için otomatik olarak oluşturulan bu anahtarları kullanarak, birkaç istemci aynı konuma yazma çakışması olmadan aynı anda alt öğe ekleyebilir. PushChild() tarafından oluşturulan benzersiz anahtar bir zaman damgasına dayanır, bu nedenle liste öğeleri otomatik olarak kronolojik olarak sıralanır.

PushChild() otomatik olarak oluşturulan anahtarının değerini almak veya alt PushChild() verileri ayarlamak için PushChild() yöntemi tarafından döndürülen yeni verilere başvuruyu kullanabilirsiniz. Arayan GetKey() bir ilgili PushChild() referans otomatik oluşturulan anahtar değerini verir.

Belirli alanları güncelleyin

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

UpdateChildren() çağırırken, anahtar için bir yol belirterek daha düşük düzeydeki alt değerleri güncelleyebilirsiniz. Veriler daha iyi ölçeklendirmek için birden çok konumda depolanırsa, veri yayma özelliğini kullanarak bu verilerin tüm örneklerini güncelleyebilirsiniz. Örneğin, bir oyunun LeaderboardEntry sınıfı şunun gibi 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 en son skor beslemesine ve kullanıcının kendi skor listesine eşzamanlı olarak 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, düğümde /scores/$key tüm kullanıcılar için girişler içeren bir giriş oluşturmak ve aynı anda key() ile key() almak için PushChild() 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 da yeni girişi nasıl oluşturduğu gibi, tek bir UpdateChildren() çağrısıyla JSON ağacındaki birden çok konuma eşzamanlı güncellemeler gerçekleştirebilirsiniz. Bu şekilde yapılan eşzamanlı güncellemeler çok 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, bu verilerin konumuna referansla RemoveValue() 'u çağırmaktır.

SetValue() veya UpdateChildren() gibi başka bir yazma işlemi için değer olarak null Variant belirterek de silebilirsiniz. Bu tekniği, tek bir API çağrısında birden çok alt UpdateChildren() silmek için UpdateChildren() ile birlikte kullanabilirsiniz.

Verilerinizin ne zaman işlendiğini bilin.

Verilerinizin Firebase Realtime Database sunucusuna ne zaman teslim edildiğini öğrenmek için Gelecekteki başarı 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 DoTransaction . Bu güncelleme işlevi, verilerin mevcut durumunu bir bağımsız değişken 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 mevcut değerle yeniden ç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 puanlar kaydetmesi veya istemcinin eski verilere sahip olması durumunda skor tablosunun yanlış olmasını önler. İşlem reddedilirse, sunucu güncel değeri istemciye döndürür ve bu da işlemi güncellenmiş değerle yeniden çalıştırır. Bu, işlem kabul edilene veya çok fazla deneme yapılana kadar tekrar eder.

Çevrimdışı veri yaz

Bir istemci ağ bağlantısını kaybederse, uygulamanız doğru şekilde çalışmaya devam edecektir.

Bir Firebase veritabanına bağlı her istemci, tüm etkin verilerin kendi dahili sürümünü saklar. Veriler yazıldığında, önce bu yerel sürüme yazılır. Firebase istemcisi daha sonra bu verileri uzak veritabanı sunucularıyla ve diğer istemcilerle "en iyi şekilde" senkronize eder.

Sonuç olarak, veritabanına yapılan tüm yazmalar, herhangi bir veri sunucuya yazılmadan önce yerel olayları anında tetikler. Bu, uygulamanızın ağ gecikmesinden veya bağlantısından bağımsız olarak yanıt vermeye devam ettiği anlamına gelir.

Bağlantı yeniden kurulduktan sonra uygulamanız, istemcinin herhangi bir özel kod yazmak zorunda kalmadan mevcut sunucu durumuyla senkronize olması için uygun olay kümesini alır.

Sonraki adımlar