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 bir DatabaseReference örneğine ihtiyacınız vardır:
// Get the root reference location of the database. firebase::database::DatabaseReference dbref = database->GetReference();
Veri Tasarrufu
Firebase Realtime Database'e veri yazmak için dört yöntem vardır:
| Yöntem | Yaygın kullanım alanları |
|---|---|
SetValue() |
Tanımlı bir yola (ör. users/<user-id>/<username>) veri yazma veya verileri değiştirme |
PushChild() |
Veri listesine ekleme Push() yöntemini 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ımlı bir yolun anahtarlarından bazılarını güncelleyin. |
RunTransaction() |
Eşzamanlı güncellemeler nedeniyle bozulabilecek karmaşık verileri güncelleme |
Bir referanstaki verileri 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 verileri değiştirebilirsiniz. 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 noktalı sayılar
- Boole
- Yaylı çalgılar
- Varyant vektörleri
- Dizelerin varyantlarla eşlemeleri
SetValue() bu şekilde kullanıldığında, alt düğümler de dahil olmak üzere belirtilen konumdaki verilerin üzerine yazılır. Ancak nesnenin tamamını yeniden yazmadan 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 alt öğe eklendiğinde benzersiz bir anahtar oluşturur. Listedeki her yeni öğe için otomatik olarak üretilmiş bu anahtarlar kullanıldığında, birden fazla istemci aynı anda aynı konuma yazma çakışması olmadan alt öğe ekleyebilir. PushChild() tarafından oluşturulan benzersiz anahtar, zaman damgasına dayalıdır. Bu nedenle, liste öğeleri otomatik olarak kronolojik sıraya göre sıralanır.
Alt öğenin otomatik olarak üretilmiş anahtarının değerini almak veya alt öğe için veri ayarlamak üzere PushChild() yönteminin döndürdüğü yeni verilerin referansını kullanabilirsiniz.
Bir PushChild() referansında GetKey() çağrıldığında otomatik olarak üretilmiş 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() yöntemini çağırırken anahtar için bir yol belirterek alt düzey alt değerleri güncelleyebilirsiniz. Veriler daha iyi ölçeklendirme için birden fazla konumda depolanıyorsa veri yayma yöntemini kullanarak bu verilerin tüm örneklerini güncelleyebilirsiniz. Örneğin, bir oyunda şöyle 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; } }
Oyun, LeaderboardEntry oluşturmak ve bunu 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<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, /scores/$key adresindeki tüm kullanıcıların girişlerini içeren düğümde bir giriş oluşturmak için PushChild() kullanılır ve aynı anda key() ile anahtar alınır. Anahtar daha sonra kullanıcının /user-scores/$userid/$key adresindeki puanlarında ikinci bir giriş oluşturmak için kullanılabilir.
Bu yolları kullanarak, JSON ağacındaki birden fazla konumda aynı anda güncelleme yapabilirsiniz. Bunun için UpdateChildren() yöntemini tek bir kez çağırmanız yeterlidir. Bu örnekte, yeni girişin her iki konumda da nasıl oluşturulduğu gösterilmektedir. Bu şekilde yapılan eşzamanlı güncellemeler atomiktir: Tüm güncellemeler ya başarılı olur ya da başarısız olur.
Verileri silin
Verileri silmenin en kolay yolu, verilerin konumuna referans vererek RemoveValue() yöntemini ç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 alt öğeyi silmek için bu tekniği UpdateChildren() ile kullanabilirsiniz.
Verilerinizin ne zaman kaydedildiğini öğrenme
Verilerinizin Firebase Realtime Database sunucusuna ne zaman kaydedildiğini öğrenmek için Future sonucunun başarılı olup olmadığını kontrol edin.
Verileri işlem olarak kaydetme
Artımlı sayaçlar gibi eşzamanlı değişiklikler nedeniyle bozulabilecek verilerle çalışırken işlem operasyonu 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 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 kaydederse veya istemcide eski veriler varsa skor tablosunun yanlış olmasını önler. İşlem reddedilirse sunucu, mevcut değeri istemciye döndürür ve istemci, 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
İstemcinin ağ bağlantısı kesilirse uygulamanız düzgün şekilde çalışmaya devam eder.
Firebase veritabanına bağlı her istemci, etkin verilerin kendi dahili sürümünü tutar. Veriler 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 önce yerel etkinlikleri hemen tetikler. Bu sayede uygulamanız, ağ gecikmesi veya bağlantı durumundan bağımsız olarak her zaman yanıt verebilir.
Bağlantı yeniden kurulduktan sonra uygulamanız, istemcinin mevcut sunucu durumuyla senkronize olması için uygun etkinlik grubunu alır. Bu işlem için özel kod yazmanız gerekmez.