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

Başlayın

Uygulamanızı henüz oluşturmadıysanız ve veritabanına erişmediyseniz önce Get Started kılavuzunu inceleyin.

DatabaseReference alma

Veritabanına veri yazmak için bir DatabaseReference örneğine ihtiyacınız vardır:

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

Verileri Kaydetme

Firebase Realtime Database'e veri yazmanın dört yöntemi vardır:

Yöntem Yaygın kullanım alanları
SetValue() Verileri users/<user-id>/<username> gibi tanımlı bir yola yazın veya değiştirin.
PushChild() Veri listesine ekleyin. Push() her çağırdığınızda Firebase, benzersiz tanımlayıcı olarak da kullanılabilecek benzersiz bir anahtar (ör. user-scores/<user-id>/<unique-score-id>) oluşturur.
UpdateChildren() Verilerin tamamını değiştirmeden, tanımlanmış bir yolun anahtarlarından bazılarını güncelleyin.
RunTransaction() Eşzamanlı güncellemeler nedeniyle bozulabilen karmaşık verileri güncelleyin.

Bir referanstaki verileri yazma, güncelleme veya silme

Temel yazma işlemleri

Temel yazma işlemleri için, verileri belirtilen bir referansa kaydetmek ve bu yoldaki mevcut verileri değiştirmek üzere SetValue()'ü kullanabilirsiniz. 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:

  • Boş (bu işlem verileri siler)
  • Tam sayılar (64 bit)
  • Çift duyarlıklı kayan nokta sayıları
  • Boole'ler
  • Dizeler
  • Varyant vektörleri
  • Varyantlarla eşleşen dize haritaları

SetValue() öğesini bu şekilde kullanmak, alt düğümler dahil olmak üzere belirtilen konumdaki verilerin üzerine yazar. Ancak yine de nesnenin tamamını 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 ekleme

Ç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 çocuk eklendiğinde benzersiz bir anahtar oluşturur. Listedeki her yeni öğe için bu otomatik olarak oluşturulan anahtarları kullanarak çeşitli istemciler, yazma çakışması olmadan aynı anda aynı konuma 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.

Alt öğenin otomatik olarak oluşturulan anahtarının değerini almak veya alt öğe için veri ayarlamak üzere PushChild() yöntemi tarafından döndürülen yeni verilere ait referansı kullanabilirsiniz. PushChild() referansında GetKey() çağrısı yapıldığında otomatik olarak oluşturulan anahtarın değeri döndürülür.

Belirli alanları güncelleme

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

UpdateChildren() çağrısı yaparken anahtar için bir yol belirterek alt düzeydeki alt öğe değerlerini güncelleyebilirsiniz. Veriler daha iyi ölçeklendirme için birden fazla konumda depolanıyorsa veri dağıtımını kullanarak bu verilerin tüm örneklerini güncelleyebilirsiniz. Örneğin, bir oyunda şuna benzer 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&ltstd::string, Object&gt ToMap() {
    std::map&ltstring, Variant&gt result = new std::map&ltstring, Variant&gt();
    result["uid"] = Variant(uid);
    result["score"] = Variant(score);

    return result;
  }
}

Oyun, LeaderboardEntry oluşturmak ve aynı anda son puan feed'ine ve kullanıcının kendi puan listesine güncellemek için 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&ltstd::string, Variant&gt entryValues = entry.ToMap();

  std::map&ltstring, Variant&gt childUpdates = new std::map&ltstring, Variant&gt();
  childUpdates["/scores/" + key] = entryValues;
  childUpdates["/user-scores/" + userId + "/" + key] = entryValues;

  dbref.UpdateChildren(childUpdates);
}

Bu örnekte, /scores/$key adresindeki tüm kullanıcıların girişlerini içeren bir düğüm oluşturmak ve key() ile anahtarı aynı anda almak için PushChild() kullanılır. Daha sonra bu anahtar, /user-scores/$userid/$key adresinde kullanıcının puanlarında ikinci bir giriş oluşturmak için kullanılabilir.

Bu yolları kullanarak, UpdateChildren() çağrısını tek seferde yaparak JSON ağacındaki birden fazla konumda eşzamanlı güncellemeler yapabilirsiniz. Bu örnekte, yeni giriş her iki konumda da oluşturulur. Bu yaklaşım, eş zamanlı olarak yapılan güncellemelerde çok önemli bir rol oynar: ya tüm güncellemeler başarılı olur ya da başarısız olur.

Verileri silin

Verileri silmenin en basit yolu, söz konusu verilerin konumuna referans vererek RemoveValue() işlevini çağırmaktır.

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

Verilerinizin ne zaman kayda alındığını öğrenin.

Verilerinizin Firebase Realtime Database sunucusuna ne zaman bağlandığını öğrenmek için başarı için Gelecek sonucunu kontrol edin.

Verileri işlem olarak kaydetme

Artımlı sayaçlar gibi eşzamanlı değişiklikler nedeniyle bozulabilen verilerle çalışırken işlem işlemi kullanabilirsiniz. Bu işleme bir DoTransaction işlevi verirsiniz. Bu güncelleme işlevi, verilerin mevcut durumunu bağımsız değişken olarak alır ve yazmak istediğiniz yeni 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 tekrar çağrılır ve yazma işlemi yeniden denenir.

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

void AddScoreToLeaders(std::string email,
                       long score,
                       DatabaseReference leaderBoardRef) {
  leaderBoardRef.RunTransaction([](firebase::database::MutableData* mutableData) {
    if (mutableData.children_count() &gt= MaxScores) {
      long minScore = LONG_MAX;
      MutableData *minVal = null;
      std::vector&ltMutableData&gt children = mutableData.children();
      std::vector&ltMutableData&gt::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 &lt minScore) {
          minScore = childScore;
          minVal = &amp*it;
        }
      }
      if (minScore &gt 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&ltstd::string, Variant&gt newScoreMap =
      new std::map&ltstd::string, Variant&gt();
    newScoreMap["score"] = score;
    newScoreMap["email"] = email;
    children.Add(newScoreMap);
    mutableData->set_value(children);
    return kTransactionResultSuccess;
  });
}

İşlem kullanmak, birden fazla kullanıcı aynı anda puan kaydediyorsa veya istemcide eski veriler varsa skor tablosunun yanlış olmasını önler. İşlem reddedilirse sunucu geçerli değeri istemciye döndürür. İstemci de işlemi güncellenmiş değerle tekrar çalıştırır. İşlem kabul edilene veya çok fazla deneme yapılana kadar bu işlem tekrarlanır.

Verileri çevrimdışı yazma

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

Bir Firebase veritabanına bağlı her istemci, etkin verilerin kendi dahili sürümünü korur. Veriler ilk olarak 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 önce yerel etkinlikleri hemen tetikler. Bu sayede uygulamanız, ağ gecikmesinden veya bağlantısından etkilenmeden yanıt vermeye devam eder.

Bağlantı yeniden kurulduktan sonra uygulamanız, özel kod yazmak zorunda kalmadan istemcinin mevcut sunucu durumuyla senkronize edilmesi için uygun etkinlik grubunu alır.

Sonraki adımlar