Veri Alma

Bu belgede, verileri alma ve Firebase verilerini sıralama ve filtreleme ile ilgili temel bilgiler verilmektedir.

Başlamadan önce

Realtime Database özelliğini kullanabilmek için:

  • Unity projenizi kaydedin ve Firebase'i kullanacak şekilde yapılandırın.

    • Unity projenizde Firebase kullanılıyorsa proje Firebase için kaydedilmiş ve yapılandırılmış demektir.

    • Unity projeniz yoksa örnek bir uygulama indirebilirsiniz.

  • Firebase Unity SDK'sını (özellikle FirebaseDatabase.unitypackage) Unity projenize ekleyin.

Firebase'i Unity projenize eklemenin hem Firebase konsolda hem de açık Unity projenizde görevler içerdiğini unutmayın (örneğin, Firebase yapılandırma dosyalarını konsoldan indirip Unity projenize taşırsınız).

Verileri alma

Firebase verileri, GetValueAsync() için tek seferlik bir çağrı yapılarak veya FirebaseDatabase referansındaki bir etkinliğe eklenerek alınır. Etkinlik işleyici, verilerin ilk durumu için bir kez, veriler her değiştiğinde ise tekrar çağrılır.

DatabaseReference alma

Veritabanından veri okumak için 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 okuma

Belirli bir yoldaki içeriklerin statik anlık görüntüsünü bir kez okumak için GetValueAsync yöntemini kullanabilirsiniz. Görev sonucunda, alt öğe verileri de dahil olmak üzere o konumdaki tüm verileri içeren bir anlık görüntü yer alır. Veri yoksa döndürülen anlık görüntü null olur.

    FirebaseDatabase.DefaultInstance
      .GetReference("Leaders")
      .GetValueAsync().ContinueWithOnMainThread(task =&gt {
        if (task.IsFaulted) {
          // Handle the error...
        }
        else if (task.IsCompleted) {
          DataSnapshot snapshot = task.Result;
          // Do something with snapshot...
        }
      });

Etkinlikleri dinleme

Verilerdeki değişikliklere abone olmak için etkinlik dinleyicileri ekleyebilirsiniz:

Etkinlik Normal kullanım
ValueChanged Bir yolun tüm içeriğindeki değişiklikleri okuma ve dinleme
ChildAdded Öğe listelerini alma veya öğe listesine eklenenleri dinleme Listelerdeki değişiklikleri izlemek için ChildChanged ve ChildRemoved ile birlikte kullanılması önerilir.
ChildChanged Bir listedeki öğelerde yapılan değişiklikleri dinleme Listelerde yapılan değişiklikleri izlemek için ChildAdded ve ChildRemoved ile birlikte kullanın.
ChildRemoved Listeden kaldırılan öğeleri dinleme Listelerde yapılan değişiklikleri izlemek için ChildAdded ve ChildChanged ile birlikte kullanın.
ChildMoved Sıralı listedeki öğelerin sırasındaki değişiklikleri dinleyin. ChildMoved etkinlikleri her zaman öğenin sırasının değişmesine neden olan ChildChanged etkinliğini (mevcut sıralama yönteminize göre) takip eder.

ValueChanged etkinliği

Belirli bir yoldaki içeriklerde yapılan değişikliklere abone olmak için ValueChanged etkinliğini kullanabilirsiniz. Bu etkinlik, dinleyici eklendiğinde bir kez, veriler (alt öğeler dahil) her değiştiğinde ise tekrar tetiklenir. Etkinlik geri çağırmasına, alt veriler de dahil olmak üzere söz konusu 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 örnekte, bir oyunun veritabanından skor tablosu puanlarını nasıl aldığı gösterilmektedir:

      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, etkinlik sırasında veritabanında belirtilen konumdaki verileri içeren bir DataSnapshot içerir. Bir anlık görüntüde Value çağrıldığında verileri temsil eden bir Dictionary<string, object> döndürülür. Konumda veri yoksa Value çağrısı null değerini döndürür.

Bu örnekte, okuma işleminin iptal edilip edilmediğini görmek için args.DatabaseError de incelenir. Örneğin, istemcinin bir Firebase veritabanı konumundan okuma izni yoksa okuma işlemi iptal edilebilir. DatabaseError simgesi, hatanın nedenini gösterir.

Daha sonra aynı yola sahip herhangi bir DatabaseReference kullanarak etkinlikten çıkabilirsiniz. DatabaseReference örnekleri kısa ömürlüdür ve herhangi bir yola ve sorguya erişmenin bir yolu olarak düşünülebilir.

      FirebaseDatabase.DefaultInstance
        .GetReference("Leaders")
        .ValueChanged -= HandleValueChanged; // unsubscribe from ValueChanged.
    }

Alt etkinlikler

Çocuk etkinlikleri, bir düğümün çocuklarında gerçekleşen belirli işlemler sonucunda tetiklenir. Örneğin, Push() yöntemiyle yeni bir çocuk eklenmesi veya UpdateChildrenAsync() yöntemiyle bir çocuğun güncellenmesi gibi. Bunların her biri, bir veritabanındaki belirli bir düğümde yapılan değişiklikleri dinlemek için yararlı olabilir. Örneğin, bir oyun, 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 etkinliği genellikle bir Firebase veritabanındaki öğelerin listesini almak için kullanılır. ChildAdded etkinliği, mevcut her alt öğe için bir kez ve belirtilen yola yeni bir alt öğe eklendiğinde tekrar tetiklenir. Dinleyiciye, yeni alt öğenin verilerini içeren bir anlık görüntü iletilir.

Bir alt düğüm her değiştirildiğinde ChildChanged olayı tetiklenir. Çocuk düğümünün alt öğelerinde yapılan değişiklikler de buna dahildir. Genellikle bir öğe listesindeki değişikliklere yanıt vermek için ChildAdded ve ChildRemoved etkinlikleriyle birlikte kullanılır. Etkinlik işleyicisine iletilen anlık görüntü, çocuğun güncellenen verilerini içerir.

ChildRemoved Etkinlik, doğrudan bir alt öğe kaldırıldığında tetiklenir. Genellikle ChildAdded ve ChildChanged geri çağırmalarıyla birlikte kullanılır. Etkinlik geri çağırmasına iletilen anlık görüntü, kaldırılan alt öğenin verilerini içerir.

ChildMoved etkinliği, alt öğelerin yeniden sıralanmasına neden olan bir güncelleme tarafından ChildChanged etkinliği her tetiklendiğinde tetiklenir. Bu özellik, OrderByChild veya OrderByValue ile sıralanmış verilerle kullanılır.

Verileri sıralama ve filtreleme

Anahtara, değere veya alt öğenin değerine göre sıralanmış verileri almak için Realtime Database Query sınıfını kullanabilirsiniz. Sıralanmış sonucu belirli sayıda sonuç, anahtar aralığı veya değer aralığına göre de filtreleyebilirsiniz.

Verileri sıralama

Sıralanmış verileri almak için sonuçların nasıl sıralanacağını belirlemek üzere sıralama yöntemlerinden birini belirterek başlayın:

Yöntem Kullanım
OrderByChild() Sonuçları belirtilen bir alt anahtarın değerine göre sıralayın.
OrderByKey() Sonuçları alt anahtarlara göre sıralayın.
OrderByValue() Sonuçları alt öğe değerlerine göre sıralayın.

Aynı anda yalnızca bir sıralama yöntemi kullanabilirsiniz. Aynı sorguda bir sıralama yöntemini birden çok kez çağırmak hataya neden olur.

Aşağıdaki örnekte, puana göre sıralanmış bir skor tablosuna nasıl abone olabileceğiniz gösterilmektedir.

      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, valuechanged etkinlik işleyicisi ile birleştirildiğinde istemciyi, her 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ırma başlıklı makalede bulabilirsiniz.

OrderByChild() yöntemine yapılan çağrı, sonuçları sıralamak için kullanılacak alt öğe anahtarını belirtir. Bu durumda sonuçlar, her alt öğedeki "score" değerine göre sıralanır. Diğer veri türlerinin nasıl sıralandığı hakkında daha fazla bilgi için Sorgu verileri nasıl sıralanır? başlıklı makaleyi inceleyin.

Veri filtreleme

Verileri filtrelemek için 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 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() Sıralama yöntemine bağlı olarak, belirtilen anahtardan veya değerden büyük ya da ona eşit öğeleri döndürür.
EndAt() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtardan veya değerden küçük ya da ona eşit öğeleri döndürür.
EqualTo() Sıralama yöntemine bağlı olarak belirtilen anahtara veya değere eşit öğeleri döndürür.

Sıralama yöntemlerinden farklı olarak, birden fazla sınır 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 olsa bile anlık görüntü bir liste olmaya devam eder. Yalnızca tek bir öğe içerir.

Sonuç sayısını sınırlama

Belirli bir geri çağırma için senkronize edilecek maksimum çocuk sayısı belirlemek üzere LimitToFirst() ve LimitToLast() yöntemlerini kullanabilirsiniz. Örneğin, 100 sınırı belirlemek için LimitToFirst() kullanırsanız başlangıçta yalnızca 100 ChildAdded geri araması alırsınız. Firebase veritabanınızda 100'den az öğe varsa her öğe için bir ChildAdded geri çağırma işlemi tetiklenir.

Öğeler değiştikçe, toplam sayı 100 olarak kalacak şekilde ChildAdded sorguya giren öğeler için geri çağırma ChildRemoved ve sorgudan çıkan öğeler için geri çağırma alırsınız.

Örneğin, aşağıdaki kod bir skor tablosundaki en yüksek puanı döndürür:

      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
    }

Anahtara veya değere göre filtreleme

Sorgular için rastgele başlangıç, bitiş ve eşdeğerlik noktaları seçmek üzere StartAt(), EndAt() ve EqualTo() simgelerini kullanabilirsiniz. Bu işlev, verileri sayfalara ayırmak veya belirli bir değere sahip çocuk öğelerini bulmak için yararlı olabilir.

Sorgu verilerinin sıralanma şekli

Bu bölümde, verilerin Query sınıfındaki her bir sıralama yöntemiyle nasıl sıralandığı açıklanmaktadır.

OrderByChild

OrderByChild() kullanılırken belirtilen alt anahtarı içeren veriler aşağıdaki gibi sıralanır:

  1. Belirtilen çocuk anahtarı için null değeri olan çocuklar ilk sırada yer alır.
  2. Belirtilen çocuk anahtarı için değeri false olan çocuklar gelir. Birden fazla alt öğenin değeri false ise bunlar anahtara göre sözlük sırasına göre sıralanır.
  3. Belirtilen çocuk anahtarı için değeri true olan çocuklar gelir. Birden fazla alt öğe true değerine sahipse anahtara göre sözlük sırasına göre sıralanır.
  4. Sayısal değere sahip çocuklar, artan düzende sıralanarak gösterilir. Belirtilen alt düğüm için birden fazla alt öğe aynı sayısal değere sahipse bunlar anahtara göre sıralanır.
  5. Dizeler sayılardan sonra gelir ve sözlükbilimsel olarak artan düzende sıralanır. Belirtilen alt düğüm için birden fazla alt öğe aynı değere sahipse bunlar anahtara göre sözlük sırasına göre sıralanır.
  6. Nesneler en sona gelir ve anahtara göre sözlük sırasına göre artan düzende sıralanır.

OrderByKey

Verilerinizi sıralamak için OrderByKey() işlevi kullanıldığında veriler, anahtara göre artan düzende döndürülür.

  1. 32 bitlik tam sayı olarak ayrıştırılabilen bir anahtara sahip çocuklar, artan düzende sıralanarak önce gelir.
  2. Anahtarı dize değeri olan çocuklar, sözlük sırasına göre artan düzende sıralanır.

OrderByValue

OrderByValue() kullanılırken çocuklar değerlerine göre sıralanır. Sıralama ölçütleri, OrderByChild() ile aynıdır. Ancak belirtilen bir alt anahtarın değeri yerine düğümün değeri kullanılır.