Bu belge, veri almanın temellerini ve Firebase verilerinin nasıl sıralanıp filtreleneceğini kapsar.
Sen başlamadan önce
Realtime Database'i kullanmadan önce yapmanız gerekenler:
Unity projenizi kaydedin ve Firebase'i kullanacak şekilde yapılandırın.
Unity projeniz zaten Firebase kullanıyorsa Firebase için zaten kayıtlı ve yapılandırılmış demektir.
Bir Unity projeniz yoksa örnek bir uygulama indirebilirsiniz.
Firebase Unity SDK'sını (özellikle
FirebaseDatabase.unitypackage
) Unity projenize ekleyin.
Unity projenize Firebase eklemenin hem Firebase konsolunda hem de açık Unity projenizde görevler içerdiğini unutmayın (örneğin, Firebase yapılandırma dosyalarını konsoldan indirir ve ardından bunları Unity projenize taşırsınız).
Veri Alma
Firebase verileri, GetValueAsync()'e tek seferlik bir çağrı yapılarak veya bir FirebaseDatabase
referansındaki bir olaya eklenerek alınır. Olay dinleyicisi, verilerin ilk durumu için bir kez ve veriler değiştiğinde tekrar çağrılır.
Veritabanı Referansı Alın
Veritabanından veri okumak için bir DatabaseReference
örneğine ihtiyacınız vardır:
using Firebase; using Firebase.Database; using Firebase.Extensions.TaskExtension; // for ContinueWithOnMainThread public class MyScript: MonoBehaviour { void Start() { // Get the root reference location of the database. DatabaseReference reference = FirebaseDatabase.DefaultInstance.RootReference; } }
Verileri bir kez oku
Belirli bir yoldaki içeriğin statik anlık görüntüsünü bir kez okumak için GetValueAsync
yöntemini kullanabilirsiniz. Görev sonucu, alt veriler de dahil olmak üzere o konumdaki tüm verileri içeren bir anlık görüntü içerecektir. Veri yoksa döndürülen anlık görüntü null
olur.
FirebaseDatabase.DefaultInstance .GetReference("Leaders") .GetValueAsync().ContinueWithOnMainThread(task => { if (task.IsFaulted) { // Handle the error... } else if (task.IsCompleted) { DataSnapshot snapshot = task.Result; // Do something with snapshot... } });
olayları dinle
Verilerdeki değişikliklere abone olmak için olay dinleyicileri ekleyebilirsiniz:
Etkinlik | tipik kullanım |
---|---|
ValueChanged | Bir yolun tüm içeriğindeki değişiklikleri okuyun ve dinleyin. |
ChildAdded | Öğe listelerini alın veya bir öğe listesine yapılan eklemeleri dinleyin. Listelerdeki değişiklikleri izlemek için ChildChanged ve ChildRemoved ile önerilen kullanım. |
ChildChanged | Listedeki öğelerde yapılan değişiklikleri dinleyin. Listelerdeki değişiklikleri izlemek için ChildAdded ve ChildRemoved ile birlikte kullanın. |
ChildRemoved | Listeden kaldırılan öğeleri dinleyin. Listelerdeki değişiklikleri izlemek için ChildAdded ve ChildChanged ile birlikte kullanın. |
ChildMoved | Sıralı bir listedeki öğelerin sırasındaki değişiklikleri dinleyin. ChildMoved olayları her zaman öğenin sırasının değişmesine neden olan ChildChanged olayını takip eder (mevcut sıralama yönteminize göre). |
ValueChanged olayı
Belirli bir yoldaki içerik değişikliklerine abone olmak için ValueChanged
olayını kullanabilirsiniz. Bu olay, dinleyici eklendiğinde bir kez ve çocuklar da dahil olmak üzere veriler her değiştiğinde tetiklenir. Olay geri araması, alt veriler de dahil olmak üzere o konumdaki tüm verileri içeren bir anlık görüntü iletilir. Veri yoksa döndürülen anlık görüntü null
olur.
Aşağıdaki örnek, veritabanından bir liderlik tablosunun puanlarını alan bir oyunu göstermektedir:
FirebaseDatabase.DefaultInstance .GetReference("Leaders") .ValueChanged += HandleValueChanged; } void HandleValueChanged(object sender, ValueChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } // Do something with the data in args.Snapshot }
ValueChangedEventArgs
olay sırasında veritabanında belirtilen konumdaki verileri içeren bir DataSnapshot
içerir. Anlık görüntüde Value
Çağırmak, verileri temsil eden bir Dictionary<string, object>
döndürür. Konumda hiçbir veri yoksa, Value
çağırmak null
değerini döndürür.
Bu örnekte, okumanın iptal edilip edilmediğini görmek için args.DatabaseError
da incelenir. Örneğin, istemcinin bir Firebase veritabanı konumundan okuma izni yoksa bir okuma iptal edilebilir. DatabaseError
hatanın neden oluştuğunu gösterir.
Daha sonra, aynı yola sahip herhangi bir DatabaseReference
kullanarak olay aboneliğinden çıkabilirsiniz. DatabaseReference
örnekleri geçicidir ve herhangi bir yola ve sorguya erişmenin bir yolu olarak düşünülebilir.
FirebaseDatabase.DefaultInstance .GetReference("Leaders") .ValueChanged -= HandleValueChanged; // unsubscribe from ValueChanged. }
Çocuk etkinlikleri
Alt olaylar, Push()
yöntemi aracılığıyla eklenen yeni bir alt öğe veya UpdateChildrenAsync()
yöntemi aracılığıyla güncellenen bir alt öğe gibi bir işlemden bir düğümün alt öğelerinin başına gelen belirli işlemlere yanıt olarak tetiklenir. Bunların her biri, bir veritabanındaki belirli bir düğümde yapılan değişiklikleri dinlemek için birlikte yararlı olabilir. Örneğin, bir oyun, aşağıda gösterildiği gibi, bir oyun oturumunun yorumlarındaki etkinliği izlemek için bu yöntemleri birlikte kullanabilir:
var ref = FirebaseDatabase.DefaultInstance .GetReference("GameSessionComments"); ref.ChildAdded += HandleChildAdded; ref.ChildChanged += HandleChildChanged; ref.ChildRemoved += HandleChildRemoved; ref.ChildMoved += HandleChildMoved; } void HandleChildAdded(object sender, ChildChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } // Do something with the data in args.Snapshot } void HandleChildChanged(object sender, ChildChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } // Do something with the data in args.Snapshot } void HandleChildRemoved(object sender, ChildChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } // Do something with the data in args.Snapshot } void HandleChildMoved(object sender, ChildChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } // Do something with the data in args.Snapshot }
ChildAdded
olayı, genellikle bir Firebase veritabanındaki öğelerin listesini almak için kullanılır. ChildAdded
olayı, varolan her alt öğe için bir kez ve ardından belirtilen yola her yeni alt öğe eklendiğinde yeniden oluşturulur. Dinleyiciye, yeni çocuğun verilerini içeren bir anlık görüntü iletilir.
ChildChanged
olayı, bir alt düğüm değiştirildiğinde her zaman tetiklenir. Bu, alt düğümün alt öğelerinde yapılan tüm değişiklikleri içerir. Bir öğe listesindeki değişikliklere yanıt vermek için genellikle ChildAdded
ve ChildRemoved
olaylarıyla birlikte kullanılır. Olay dinleyicisine iletilen anlık görüntü, alt öğe için güncellenmiş verileri içerir.
ChildRemoved
olayı, hemen bir alt öğe kaldırıldığında tetiklenir. Genellikle ChildAdded
ve ChildChanged
geri aramalarıyla birlikte kullanılır. Olay geri aramasına iletilen anlık görüntü, kaldırılan alt öğenin verilerini içerir.
ChildMoved
olayı, ChildChanged
olayı çocuğun yeniden sıralanmasına neden olan bir güncelleme tarafından her başlatıldığında tetiklenir. OrderByChild
veya OrderByValue
ile sıralanan verilerle kullanılır.
Verileri sıralama ve filtreleme
Anahtara, değere veya bir alt öğenin değerine göre sıralanmış verileri almak için Gerçek Zamanlı Veritabanı Query
sınıfını kullanabilirsiniz. Ayrıca, sıralanan sonucu belirli sayıda sonuca veya bir anahtar veya değer aralığına göre filtreleyebilirsiniz.
Verileri sırala
Sıralanmış verileri almak için, sonuçların nasıl sıralanacağını belirlemek için sıralama yöntemlerinden birini belirleyerek başlayın:
Yöntem | kullanım |
---|---|
OrderByChild() | Sonuçları belirtilen alt anahtarın değerine göre sıralayın. | OrderByKey() | Sonuçları alt anahtarlara göre sıralayın. |
OrderByValue() | Sonuçları alt değerlere göre sıralayın. |
Aynı anda yalnızca bir sıralama yöntemi kullanabilirsiniz. Aynı sorguda bir order-by yöntemini birden çok kez çağırmak hata verir.
Aşağıdaki örnek, puana göre sıralanmış bir puan skor tablosuna nasıl abone olabileceğinizi gösterir.
FirebaseDatabase.DefaultInstance .GetReference("Leaders").OrderByChild("score") .ValueChanged += HandleValueChanged; } void HandleValueChanged(object sender, ValueChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } // Do something with the data in args.Snapshot }
Bu, bir valuechanged olay dinleyicisi ile birleştirildiğinde, istemciyi her bir girişin puanına göre sıralanmış şekilde veritabanındaki skor tablosuyla senkronize eden bir sorgu tanımlar. Verilerinizi verimli bir şekilde yapılandırma hakkında daha fazla bilgiyi Veritabanınızı Yapılandırın bölümünde bulabilirsiniz.
OrderByChild()
yöntemine yapılan çağrı, sonuçların sıralanacağı alt anahtarı belirtir. Bu durumda, sonuçlar her çocuktaki "score"
değerine göre sıralanır. Diğer veri türlerinin nasıl sıralandığı hakkında daha fazla bilgi için bkz . Sorgu verileri nasıl sıralanır .
Verileri filtreleme
Verileri filtrelemek için, bir sorgu oluştururken sınır veya aralık yöntemlerinden herhangi birini bir sıralama yöntemiyle birleştirebilirsiniz.
Yöntem | kullanım |
---|---|
LimitToFirst() | Sıralı sonuç listesinin başından itibaren döndürülecek maksimum öğe sayısını ayarlar. |
LimitToLast() | Sıralı sonuç listesinin sonundan döndürülecek maksimum öğe sayısını ayarlar. |
StartAt() | Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden büyük veya ona eşit öğeleri döndürün. |
EndAt() | Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden küçük veya ona eşit öğeler döndürün. |
EqualTo() | Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtara veya değere eşit öğeler döndürür. |
Sıralama yöntemlerinin aksine, birden çok limit veya aralık işlevini birleştirebilirsiniz. Örneğin, sonuçları belirli bir değer aralığıyla sınırlamak için StartAt()
ve EndAt()
yöntemlerini birleştirebilirsiniz.
Sorgu için yalnızca tek bir eşleşme olduğunda bile, anlık görüntü yine de bir listedir; sadece tek bir öğe içerir.
Sonuç sayısını sınırla
Belirli bir geri arama için eşitlenecek maksimum çocuk sayısını ayarlamak için LimitToFirst()
ve LimitToLast()
yöntemlerini kullanabilirsiniz. Örneğin, 100'lük bir sınır ayarlamak için LimitToFirst()
kullanırsanız, başlangıçta yalnızca 100'e kadar ChildAdded
geri arama alırsınız. Firebase veritabanınızda depolanan 100'den az öğeniz varsa, her öğe için bir ChildAdded
geri araması tetiklenir.
Öğeler değiştikçe, sorguya giren öğeler için ChildAdded
geri aramaları ve sorgudan çıkan öğeler için ChildRemoved
geri aramaları alırsınız, böylece toplam sayı 100'de kalır.
Örneğin, aşağıdaki kod bir liderlik tablosundaki en yüksek puanı verir:
FirebaseDatabase.DefaultInstance .GetReference("Leaders").OrderByChild("score").LimitToLast(1) .ValueChanged += HandleValueChanged; } void HandleValueChanged(object sender, ValueChangedEventArgs args) { if (args.DatabaseError != null) { Debug.LogError(args.DatabaseError.Message); return; } // Do something with the data in args.Snapshot }
Anahtar veya değere göre filtreleme
Sorgular için rasgele başlangıç, bitiş ve denklik noktaları seçmek için StartAt()
, EndAt()
ve EqualTo()
öğelerini kullanabilirsiniz. Bu, verileri sayfalandırmak veya belirli bir değere sahip alt öğelerin bulunduğu öğeleri bulmak için yararlı olabilir.
Sorgu verileri nasıl sıralanır?
Bu bölümde, verilerin Query
sınıfındaki sıralama yöntemlerinin her birine göre nasıl sıralandığı açıklanmaktadır.
OrderByChild
OrderByChild()
kullanılırken, belirtilen alt anahtarı içeren veriler şu şekilde sıralanır:
- Belirtilen alt anahtar için
null
değere sahip çocuklar önce gelir. - Ardından, belirtilen alt anahtar için
false
değerine sahip alt öğeler gelir. Birden fazla alt öğefalse
değerine sahipse, bunlar sözlüksel olarak anahtara göre sıralanır. - Ardından, belirtilen alt anahtar için
true
değerine sahip alt öğeler gelir. Birden fazla alt öğetrue
değerine sahipse, bunlar sözlüksel olarak anahtara göre sıralanır. - Sayısal değeri olan çocuklar, artan düzende sıralanır. Birden çok alt öğe, belirtilen alt düğüm için aynı sayısal değere sahipse, bunlar anahtara göre sıralanır.
- Dizeler sayılardan sonra gelir ve sözlüksel olarak artan düzende sıralanır. Birden çok alt öğe, belirtilen alt düğüm için aynı değere sahipse, anahtara göre sözlüksel olarak sıralanır.
- Nesneler en son gelir ve artan düzende anahtara göre sözlüksel olarak sıralanır.
OrderByKey
Verilerinizi sıralamak için OrderByKey()
kullanıldığında, veriler anahtara göre artan düzende döndürülür.
- 32 bitlik bir tamsayı olarak ayrıştırılabilen bir anahtarı olan alt öğeler, artan düzende sıralanarak önce gelir.
- Sırada anahtarları dize değeri olan çocuklar gelir ve sözlüksel olarak artan düzende sıralanır.
OrderByValue
OrderByValue()
kullanılırken, çocuklar değerlerine göre sıralanır. Sıralama ölçütleri, belirtilen alt anahtarın değeri yerine düğümün değerinin kullanılması dışında OrderByChild()
ile aynıdır.