Başlamadan önce
Realtime Database kullanmaya başlamak için şunları yapmanız gerekir:
Unity projenizi kaydedin ve Firebase'i kullanacak şekilde yapılandırın.
Unity projeniz Firebase'i kullanıyorsa Firebase için zaten kayıtlı ve yapılandırılmış demektir.
Unity projeniz yoksa örnek uygulama indirebilirsiniz.
Firebase Unity SDK'sını (özellikle
FirebaseDatabase.unitypackage) Unity projenize ekleyin.
Unity projenize Firebase eklemek için hem Firebase konsolunda hem de açık Unity projenizde görevler gerçekleştirmeniz gerekir (örneğin, Firebase yapılandırma dosyalarını konsoldan indirip Unity projenize taşımanız gerekir).
Veri Tasarrufu
Firebase Realtime Database'e veri yazmak için beş yöntem vardır:
| Yöntem | Yaygın kullanım alanları |
|---|---|
SetValueAsync() |
Tanımlı bir yola (ör. users/<user-id>/<username>) veri yazma veya verileri değiştirme |
SetRawJsonValueAsync() |
Verileri ham JSON ile yazın veya değiştirin (ör. users/<user-id>/<username>). |
Push() |
Veri listesine ekleme Push() yöntemini her çağırdığınızda Firebase, benzersiz bir tanımlayıcı olarak da kullanılabilecek benzersiz bir anahtar (ör. user-scores/<user-id>/<unique-score-id>) oluşturur. |
UpdateChildrenAsync() |
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 |
DatabaseReference alma
Veritabanına veri yazmak için bir DatabaseReference örneğine ihtiyacınız vardır:
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 belirtilen bir referansa kaydedebilir ve bu yoldaki mevcut verileri değiştirebilirsiniz. Bu yöntemi kullanarak, mevcut JSON türlerine karşılık gelen türleri aşağıdaki gibi iletebilirsiniz:
stringlongdoubleboolDictionary<string, Object>List<Object>
Yazılı bir C# nesnesi kullanıyorsanız nesneyi ham JSON'a dönüştürmek ve SetRawJsonValueAsync() yöntemini çağırmak için yerleşik JsonUtility.ToJson() yöntemini kullanabilirsiniz.
Örneğin, aşağıdaki gibi bir User 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() ile kullanıcı eklemek için aşağıdaki adımları uygulayabilirsiniz:
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() yöntemini bu şekilde kullanmak, alt düğümler de dahil olmak üzere belirtilen konumdaki verilerin üzerine yazar. Ancak nesnenin tamamını yeniden yazmadan alt öğeleri güncelleyebilirsiniz. Kullanıcıların profillerini güncelleyebilmesini istiyorsanız kullanıcı adını şu şekilde güncelleyebilirsiniz:
mDatabaseRef.Child("users").Child(userId).Child("username").SetValueAsync(name);
Veri listesine ekleme
Çok kullanıcılı uygulamalarda bir listeye veri eklemek için Push() yöntemini kullanın.
Push() 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ı kullanarak birden fazla istemci, yazma çakışması olmadan aynı konuma aynı anda alt öğe ekleyebilir. Push() 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 Push() yönteminin döndürdüğü yeni verilere yapılan referansı kullanabilirsiniz. Bir Push() referansında Key ç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 UpdateChildrenAsync() yöntemini kullanın.
UpdateChildrenAsync() 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:
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; } }
Oyun, LeaderboardEntry oluşturmak ve bunu aynı anda son skor feed'ine ve kullanıcının kendi skor listesine güncellemek için 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, /scores/$key adresindeki tüm kullanıcılar için girişleri içeren düğümde bir giriş oluşturmak üzere Push() 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 yapmak için UpdateChildrenAsync() yöntemini tek bir kez çağırabilirsiniz. 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.
SetValueAsync() veya UpdateChildrenAsync() gibi başka bir yazma işlemi için değer olarak null belirterek de silebilirsiniz. Tek bir API çağrısında birden fazla alt öğeyi silmek için bu tekniği UpdateChildrenAsync() ile kullanabilirsiniz.
Verilerinizin ne zaman kaydedildiğini öğrenme
Verilerinizin Firebase Realtime Database sunucusuna ne zaman kaydedildiğini öğrenmek için bir devam ekleyebilirsiniz. Hem SetValueAsync() hem de UpdateChildrenAsync(), işlemin ne zaman tamamlandığını öğrenmenizi sağlayan bir Task döndürür. Çağrı herhangi bir nedenle başarısız olursa Tasks IsFaulted, hatanın nedenini belirten Exception özelliğiyle birlikte doğru olur.
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 Func veriyorsunuz. Bu güncelleme Func, 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:
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); }); }
İş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. İstemci de 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ılırken ö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 verir.
Bağlantı yeniden kurulduğunda uygulamanız uygun etkinlik grubunu alır. Böylece istemci, herhangi bir özel kod yazmaya gerek kalmadan mevcut sunucu durumuyla senkronize olur.