Başlayın
Henüz yapmadıysanız önce Get Started
rehberine bakın
henüz uygulamanızın kurulumunu yapma ve veritabanına erişme işlemlerini yapabilirsiniz.
Veritabanı Referansı Alma
Veritabanı'na veri yazmak için DatabaseReference
örneğinin olması gerekir:
// Get the root reference location of the database. firebase::database::DatabaseReference dbref = database->GetReference();
Verileri Kaydetme
Firebase Realtime Database içine veri yazmak için dört yöntem vardır:
Yöntem | Yaygın kullanım alanları |
---|---|
SetValue() |
Belirli bir yola veri yazma veya değiştirme (ör.
users/<user-id>/<username> |
PushChild() |
Veri listesine ekleme. Her aradığınızda
Push() , Firebase, ayrıca kullanılabilecek benzersiz bir anahtar oluşturur
benzersiz bir tanımlayıcı olarak,
user-scores/<user-id>/<unique-score-id> . |
UpdateChildren() |
Tanımlanan yol için bazı anahtarları, bahsedeceğim. |
RunTransaction() |
Eşzamanlı güncellemelerle bozulabilecek karmaşık verileri güncelleyin. |
Bir referanstaki verileri yazma, güncelleme veya silme
Temel yazma işlemleri
Temel yazma işlemleri için SetValue()
kullanarak verileri bir
bu yoldaki mevcut tüm verilerin yerine geçer. Bunu kullanabilirsiniz
aşağıdakilerin desteklendiği bir Varyant türü üzerinden JSON tarafından kabul edilen türlerin iletilmesini sağlayan bir yöntem içerir:
- Null (bu işlem verileri siler)
- Tamsayılar (64 bit)
- Çift duyarlıklı kayan nokta sayıları
- Boole
- Dizeler
- Varyant Vektörleri
- Dizelerin Varyantlarla haritaları
SetValue()
bu şekilde kullanılırsa belirtilen konumdaki verilerin üzerine yazılır.
dahildir. Ancak, eğer yoksa çocuklarınız için
yeniden yazmanız gerekir. Kullanıcıların profillerini güncellemelerine izin vermek istiyorsanız
kullanıcı adını şu şekilde 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, yeni bir anahtar oluşturulmasını her seferinde benzersiz bir anahtar
alt öğesi, belirtilen Firebase referansına eklenir. Bu araçları kullanarak
için otomatik olarak oluşturulan anahtarlardan yararlanırken, bazı müşteriler
yazma çakışmaları olmadan aynı anda aynı konuma alt öğe ekleme. İlgili içeriği oluşturmak için kullanılan
PushChild()
tarafından oluşturulan benzersiz anahtar, bir zaman damgasına dayanı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ı kullanabilirsiniz
alt yayıncının otomatik olarak oluşturulan anahtarın değerini alma veya çocuk için verileri ayarlama.
PushChild()
referansında GetKey()
çağrısı yapıldığında,
otomatik olarak oluşturulan anahtardır.
Belirli alanları güncelle
Diğer düğümlerin üzerine yazmadan bir düğümün belirli alt öğelerine aynı anda yazmak için
alt düğümler için UpdateChildren()
yöntemini kullanın.
UpdateChildren()
çağrısı yapılırken alt düzey alt değerleri şu şekilde güncelleyebilirsiniz:
anahtar için bir yol belirterek. Veriler ölçeklendirilmek üzere birden fazla konumda depolanıyorsa
isterseniz, bu verilerin tüm örneklerini
verilerin yayılması. Örneğin,
oyunda şunun 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 en son skorla güncellemek için
kullanıcının kendi puan listesini çıkarırsanız oyun şu 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, şunu içeren düğümde bir giriş oluşturmak için PushChild()
kullanılmaktadır:
/scores/$key
alanındaki tüm kullanıcılar için giriş yapar ve anahtarı
key()
. Bu anahtar, kullanıcının iş sayfasında ikinci bir giriş oluşturmak için kullanılabilir.
skor /user-scores/$userid/$key
.
Bu yolları kullanarak, bir bölgedeki birden fazla konumda aynı anda güncelleme yapabilirsiniz.
tek bir UpdateChildren()
çağrısıyla JSON ağacını oluşturabilirsiniz (örneğin,
örnek, her iki konumda da yeni girişi oluşturur. Eş zamanlı güncellemeler yapıldı
ya tüm güncellemeler başarılı olur ya da başarısız olur.
Verileri silin
Verileri silmenin en basit yolu,RemoveValue()
söz konusu verilerin konumu.
Başka bir yazmanın değeri olarak null
Variant
belirterek de silebilirsiniz
SetValue()
veya UpdateChildren()
gibi bir işlem. Bunu kullanabilirsiniz
tek bir API'de birden fazla alt öğeyi silmek için UpdateChildren()
ile teknik
çağrısına bir tıklama URL'si eklemeniz gerekir.
Verilerinizin kaydedildiği zamanı öğrenin.
Verilerinizin ne zaman Firebase Realtime Database sunucusuna kaydedildiğini öğrenmek için şunları kontrol edin: Gelecekteki başarının sonuçlarını gösterir.
Verileri işlem olarak kaydet
Eşzamanlı etkenlere göre bozulabilecek verilerle çalışırken
artımlı sayaçlar gibi değişiklikleri yapmak için
işlemin işleyiş şekli.
Bu işleme bir DoTransaction
işlevi verirsiniz. Bu güncelleme işlevi
bağımsız değişken olarak verilerin mevcut durumunu değiştirir ve istenen yeni durumu döndürür
seçin. Başka bir istemci sizden önce konuma yazarsa
yeni değer başarıyla yazıldığından, güncelleme fonksiyonunuz
değeri gösterilir ve yazma işlemi yeniden denenir.
Örneğin, bir oyunda kullanıcıların bir skor tablosunu en yüksek beş puan:
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şlem kullanmak, birden fazla işlem varsa skor tablosunun yanlış olmasını önler Kullanıcı puanları aynı anda kaydeder ya da müşterinin verileri eskidir. Öğe işlem reddedilirse sunucu geçerli değeri istemciye döndürür. güncel değerle işlemi yeniden çalıştırır. Bu işlem, İşlem kabul edildi veya çok fazla deneme yapıldı.
Çevrimdışı veri yazma
İstemcinin ağ bağlantısı kesilirse uygulamanız çalışmaya devam eder sağlayabilir.
Firebase veritabanına bağlı her istemcinin kendi dahili sürümü bulunur olabilir. Veriler yazıldığında, bu yerel sürüme yazılır. tıklayın. Firebase istemcisi bu verileri uzak veritabanı ile senkronize eder sağlamak için "en iyisini" yaparak .
Sonuç olarak, veritabanına yapılan tüm yazmalar yerel etkinlikleri hemen, sunucuya herhangi bir veri yazıldığından emin olabilirsiniz. Bu, uygulamanızın tüm ağ gecikmeleri veya bağlantılarından bağımsız şekilde yanıt verebilir.
Bağlantı yeniden kurulduğunda uygulamanız uygun veri kümesini alır Böylece istemcinin, istemcinin bunu gerçekleştirmesine gerek kalmadan mevcut sunucu durumuyla herhangi bir özel kod yazabilirsiniz.