Başlamadan önce
Kullanmadan önce Gerçek Zamanlı Veritabanı, Yapmanız gerekenler:
Unity projenizi kaydedin ve Firebase'i kullanacak şekilde yapılandırın.
Unity projeniz zaten Firebase kullanıyorsa kaydedilip yapılandırıldı.
Unity projeniz yoksa şunu indirebilirsiniz: örnek uygulama.
Firebase Unity SDK'sını (özellikle,
FirebaseDatabase.unitypackage
) derleyip toparlarsınız.
Firebase'i Unity projenize eklemenin hem Firebase konsolunda ve açık Unity projenizde (örneğin, Firebase yapılandırma dosyalarını konsoldan indirip bu dosyalara bunları Unity projenize ekleyin).
Verileri Kaydetme
Firebase Realtime Database'e veri yazmak için beş yöntem vardır:
Yöntem | Yaygın kullanım alanları |
---|---|
SetValueAsync() |
Belirli bir yola veri yazma veya değiştirme (ör.
users/<user-id>/<username> |
SetRawJsonValueAsync() |
Verileri ham Json ile yazın veya değiştirin. Örneğin:
users/<user-id>/<username> |
Push() |
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> . |
UpdateChildrenAsync() |
Tanımlanan yol için bazı anahtarları, bahsedeceğim. |
RunTransaction() |
Eşzamanlı güncellemelerle bozulabilecek karmaşık verileri güncelleyin. |
Veritabanı Referansı Alma
Veritabanı'na veri yazmak için DatabaseReference
örneğinin olması gerekir:
using Firebase; using Firebase.Database; public class MyScript: MonoBehaviour { void Start() { // Get the root reference location of the database. DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference; } }
Bir referanstaki verileri yazma, güncelleme veya silme
Temel yazma işlemleri
Temel yazma işlemleri için SetValueAsync()
kullanarak verileri bir
bu yoldaki mevcut tüm verilerin yerine geçer. Bunu kullanabilirsiniz
yöntemini kullanabilirsiniz:
string
long
double
bool
Dictionary<string, Object>
List<Object>
Türü belirtilmiş bir C# nesnesi kullanıyorsanız yerleşik JsonUtility.ToJson()
öğesini kullanabilirsiniz
kullanarak SetRawJsonValueAsync()
komutunu çağırın.
Örneğin, aşağıdaki gibi görünen bir Kullanıcı sınıfınız olabilir:
public class User { public string username; public string email; public User() { } public User(string username, string email) { this.username = username; this.email = email; } }
SetRawJsonValueAsync()
uygulamasına sahip bir kullanıcıyı aşağıdaki şekilde ekleyebilirsiniz:
private void writeNewUser(string userId, string name, string email) { User user = new User(name, email); string json = JsonUtility.ToJson(user); mDatabaseRef.Child("users").Child(userId).SetRawJsonValueAsync(json); }
SetValueAsync()
veya SetRawJsonValueAsync()
bu şekilde kullanılırsa verilerin üzerine yazılır
belirtilen konumda (tüm alt düğümler dahil) yer alır. Ancak,
bir alt öğeyi tamamen yeniden yazmadan güncelleyebilirsiniz. Kullanıcılara izin vermek istiyorsanız
kullanıcı adını aşağıdaki şekilde güncelleyebilirsiniz:
mDatabaseRef.Child("users").Child(userId).Child("username").SetValueAsync(name);
Veri listesine ekle
Çok kullanıcılı uygulamalarda bir listeye veri eklemek için Push()
yöntemini kullanın.
Push()
yöntemi, yeni bir anahtar oluşturulmasını her seferinde benzersiz bir anahtar
alt öğesi, belirtilen Firebase referansına eklenir. Bu araçları kullanarak
her yeni öğe için otomatik olarak oluşturulan anahtarlara sahip olduğundan, bazı müşteriler
yazma çakışmaları olmadan aynı anda aynı konuma alt öğe ekleme. İlgili içeriği oluşturmak için kullanılan
Push()
tarafından oluşturulan benzersiz anahtar bir zaman damgasına dayalı olduğundan liste öğeleri
kronolojik olarak otomatik olarak sıralanır.
Aşağıdakileri almak için Push()
yönteminin döndürdüğü yeni verilere referansı kullanabilirsiniz.
alt yayıncının otomatik olarak oluşturduğu anahtarın değerini veya çocuk için veri ayarlayın. Telefon etme
Push()
referansındaki Key
,
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 UpdateChildrenAsync()
yöntemini kullanın.
UpdateChildrenAsync()
ç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:
public class LeaderboardEntry { public string uid; public int score = 0; public LeaderboardEntry() { } public LeaderboardEntry(string uid, int score) { this.uid = uid; this.score = score; } public Dictionary<string, Object> ToDictionary() { Dictionary<string, Object> result = new Dictionary<string, Object>(); result["uid"] = uid; result["score"] = score; return result; } }
Skor Tablosu girişi oluşturmak ve aynı anda en son skora güncellemek için feed'i ve kullanıcının kendi skor listesini görürseniz oyun, aşağıdaki gibi bir kod kullanır:
private void WriteNewScore(string userId, int score) { // Create new entry at /user-scores/$userid/$scoreid and at // /leaderboard/$scoreid simultaneously string key = mDatabase.Child("scores").Push().Key; LeaderBoardEntry entry = new LeaderBoardEntry(userId, score); Dictionary<string, Object> entryValues = entry.ToDictionary(); Dictionary<string, Object> childUpdates = new Dictionary<string, Object>(); childUpdates["/scores/" + key] = entryValues; childUpdates["/user-scores/" + userId + "/" + key] = entryValues; mDatabase.UpdateChildrenAsync(childUpdates); }
Bu örnekte, şuna ait girişleri içeren düğümde bir giriş oluşturmak için Push()
kullanılmıştır:
/scores/$key
alanındaki tüm kullanıcıları 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 UpdateChildrenAsync()
ç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 yazma işleminin değeri olarak null
değerini belirterek de silebilirsiniz
SetValueAsync()
veya UpdateChildrenAsync()
gibi bir işlem. Bunu kullanabilirsiniz
tek bir API'de birden fazla alt öğeyi silmek için UpdateChildrenAsync()
ile teknik
çağrısına bir tıklama URL'si eklemeniz gerekir.
Verilerinizin kaydedildiği zamanı öğrenin.
Verilerinizin Firebase Realtime Database sunucusuna ne zaman aktarıldığını öğrenmek için
bir devamlılık ekleyebilirsiniz. Hem SetValueAsync()
hem de UpdateChildrenAsync()
işlemin tamamlandığını size bildiren bir Task
döndürür. Öğe
herhangi bir nedenle başarısız olursa Görevler IsFaulted
Hatanın neden oluştuğunu belirten Exception
özelliği.
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 Func
verirsiniz. Bu güncelleme (Func
) geçerli durumu alır
bağımsız değişken olarak sunar ve istediğiniz yeni durumu döndürür.
yazma. Başka bir istemci konuma yazarsa yeni değeriniz
güncelleme fonksiyonunuz yeni geçerli kod
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:
private void AddScoreToLeaders(string email, long score, DatabaseReference leaderBoardRef) { leaderBoardRef.RunTransaction(mutableData => { List<object> leaders = mutableData.Value as List<object> if (leaders == null) { leaders = new List<object>(); } else if (mutableData.ChildrenCount >= MaxScores) { long minScore = long.MaxValue; object minVal = null; foreach (var child in leaders) { if (!(child is Dictionary<string, object>)) continue; long childScore = (long) ((Dictionary<string, object>)child)["score"]; if (childScore < minScore) { minScore = childScore; minVal = child; } } if (minScore > score) { // The new score is lower than the existing 5 scores, abort. return TransactionResult.Abort(); } // Remove the lowest score. leaders.Remove(minVal); } // Add the new high score. Dictionary<string, object> newScoreMap = new Dictionary<string, object>(); newScoreMap["score"] = score; newScoreMap["email"] = email; leaders.Add(newScoreMap); mutableData.Value = leaders; return TransactionResult.Success(mutableData); }); }
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 hızlı bir şekilde yanıt verir.
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.