Başlayın
Uygulamanızı ve veritabanına erişimi henüz ayarlamadıysanız önce Get Started
kılavuzuna bakın.
DatabaseReference alma
Veritabanına veri yazmak için 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 öğesine veri yazmak için dört yöntem vardır:
Yöntem | Yaygın kullanım alanları |
---|---|
SetValue() |
Verileri tanımlı bir yola yazın veya bu yoldaki verileri değiştirin. Örneğin:
users/<user-id>/<username> . |
PushChild() |
Veri listesine ekleme Push() işlevini her çağırdığınızda Firebase, user-scores/<user-id>/<unique-score-id> gibi benzersiz tanımlayıcı olarak da kullanılabilen benzersiz bir anahtar oluşturur. |
UpdateChildren() |
Tanımlanmış bir yolun anahtarlarından bazılarını tüm verileri değiştirmeden güncelleyin. |
RunTransaction() |
Eşzamanlı güncellemeler nedeniyle bozulabilecek karmaşık verileri güncelleyin. |
Referansta veri yazma, güncelleme veya silme
Temel yazma işlemleri
Temel yazma işlemleri için SetValue()
kullanarak verileri belirtilen bir referansa kaydedebilir ve bu yoldaki mevcut verilerin yerini alabilirsiniz. Bu yöntemi, JSON tarafından kabul edilen türleri aşağıdaki türleri destekleyen bir Variant türü üzerinden aktarmak için kullanabilirsiniz:
- Boş (bu, verileri siler)
- Tam sayılar (64 bit)
- Çift duyarlıklı kayan nokta sayıları
- Boole'lar
- Yaylı çalgılar
- Varyant Vektörleri
- Dizeleri varyantlarla eşleme
SetValue()
öğesini bu şekilde kullanmak, belirtilen konumdaki verilerin (alt düğümler dahil) üzerine yazar. Ancak yine de tüm nesneyi yeniden yazmadan bir çocuğu güncelleyebilirsiniz. Kullanıcıların profillerini güncellemesine 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 alt öğe eklendiğinde benzersiz bir anahtar oluşturur. Listedeki her yeni öğe için bu otomatik olarak oluşturulan anahtarları kullanarak birden fazla istemci, yazma çakışmaları olmadan aynı anda aynı konuma alt öğeler ekleyebilir. PushChild()
tarafından oluşturulan benzersiz anahtar, zaman damgasına dayalıdır. Bu nedenle, liste öğeleri kronolojik olarak otomatik olarak sıralanır.
PushChild()
yöntemi tarafından döndürülen yeni verilere yapılan referansı kullanarak çocuğun otomatik olarak oluşturulan anahtarının değerini alabilir veya çocuk için veri ayarlayabilirsiniz.
PushChild()
referansında GetKey()
çağrıldığında otomatik olarak oluşturulan anahtarın değeri döndürülür.
Belirli alanları güncelleme
Bir düğümün belirli alt öğelerine diğer alt düğümleri üzerine yazmadan aynı anda yazmak için UpdateChildren()
yöntemini kullanın.
UpdateChildren()
işlevini çağırırken anahtar için bir yol belirterek alt düzeydeki alt değerleri güncelleyebilirsiniz. Veriler daha iyi ölçeklendirme için birden fazla konumda depolanıyorsa veri dağıtımı kullanarak bu verilerin tüm örneklerini güncelleyebilirsiniz. Örneğin, bir oyunda aşağıdaki 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 bunu son skor feed'i ve kullanıcının kendi skor listesiyle güncellemek için oyunda aşağıdaki kod kullanılı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, PushChild()
kullanılarak /scores/$key
konumundaki tüm kullanıcıların girişlerini içeren düğümde bir giriş oluşturulur ve aynı anda key()
ile anahtar alınır. Ardından anahtar, kullanıcının /user-scores/$userid/$key
puanlarında ikinci bir giriş oluşturmak için kullanılabilir.
Bu yolları kullanarak, UpdateChildren()
için tek bir çağrıyla JSON ağacındaki birden fazla konumda eşzamanlı güncellemeler yapabilirsiniz. Örneğin, bu örnekte her iki konumda da yeni giriş oluşturulur. Bu şekilde yapılan eşzamanlı güncellemeler atomiktir: Tüm güncellemeler başarılı olur veya tüm güncellemeler başarısız olur.
Verileri silin
Verileri silmenin en basit yolu, verilerin konumuna yapılan bir referansta RemoveValue()
işlevini çağırmaktır.
Ayrıca SetValue()
veya UpdateChildren()
gibi başka bir yazma işlemi için değer 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 birlikte kullanabilirsiniz.
Verilerinizin ne zaman işlendiğini öğrenin.
Verilerinizin Firebase Realtime Database sunucusuna ne zaman işlendiğini öğrenmek için Gelecek sonucunun başarılı olup olmadığını kontrol edin.
Verileri işlem olarak kaydetme
Eşzamanlı değişiklikler nedeniyle bozulabilecek verilerle (ör. artımlı sayaçlar) çalışırken işlem işlemi kullanabilirsiniz.
Bu işleme DoTransaction
işlevini atarsınız. Bu güncelleme işlevi, verilerin mevcut durumunu 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 geçerli değerle tekrar çağrılır ve yazma işlemi yeniden denenir.
Örneğin, bir oyunda kullanıcıların skor tablosunu en yüksek beş puanla 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; }); }
İşlem kullanmak, birden fazla kullanıcı aynı anda puan kaydettiğinde veya istemcide eski veriler olduğunda skor tablosunun yanlış olmasını önler. İşlem reddedilirse sunucu, mevcut değeri istemciye döndürür. İstemci, işlemi güncellenmiş değerle tekrar çalıştırır. Bu işlem, işlem kabul edilene veya çok fazla deneme yapılana kadar tekrarlanır.
Verileri çevrimdışı yazma
Bir istemcinin ağ bağlantısı kesilirse uygulamanız doğru şekilde çalışmaya devam eder.
Firebase veritabanına bağlı her istemci, etkin verilerin kendi dahili sürümünü korur. Veriler yazılırken önce bu yerel sürüme yazılır. Ardından Firebase istemcisi, bu verileri uzak veritabanı sunucularıyla ve diğer istemcilerle "en iyi çaba" prensibine göre senkronize eder.
Sonuç olarak, veritabanına yapılan tüm yazma işlemleri, sunucuya herhangi bir veri yazılmadan önce yerel etkinlikleri anında tetikler. Bu sayede uygulamanız, ağ gecikmesinden veya bağlantısından bağımsız olarak yanıt vermeye devam eder.
Bağlantı yeniden kurulduğunda uygulamanız, istemcinin mevcut sunucu durumuyla senkronize olması için uygun etkinlik kümesini alır. Bu işlem için özel kod yazmanız gerekmez.