Veri Alma

Bu belgede, veri alma ve Firebase verilerini sıralama ve filtrelemeyle 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 projeniz zaten Firebase kullanıyorsa Firebase için 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.

Firebase'i Unity projenize 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 indirip Unity projenize taşırsınız).

Veriler Alınıyor

Firebase verileri, GetValueAsync() işlevinin bir kez çağrılmasıyla veya FirebaseDatabase referansında bir etkinliğe bağlanarak alınır. Etkinlik dinleyicisi, verilerin ilk durumu için bir kez ve veriler değiştiğinde her defasında çağrılır.

DatabaseReference alma

Veritabanında verileri 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ü tek seferde okumak için GetValueAsync yöntemini kullanabilirsiniz. Görev sonucu, alt veriler dahil olmak üzere bu konumdaki tüm verileri içeren bir anlık görüntü içerir. 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...
        }
      });

Etkinlikleri dinleme

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

Etkinlik Tipik kullanım
ValueChanged Bir yolun tüm içeriklerindeki değişiklikleri okuyup dinleyebilirsiniz.
ChildAdded Öğe listelerini alma veya öğe listesine eklenen öğeleri dinleme Listelerdeki değişiklikleri izlemek için ChildChanged ve ChildRemoved ile birlikte kullanılması önerilir.
ChildChanged Listedeki öğelerde yapılan değişiklikleri dinleme Listelerdeki değişiklikleri izlemek için ChildAdded ve ChildRemoved ile birlikte kullanın.
ChildRemoved Bir listeden öğelerin kaldırılmasını dinleyin. Listelerdeki değişiklikleri izlemek için ChildAdded ve ChildChanged ile birlikte kullanın.
ChildMoved Sıralı bir listedeki öğelerin sırasıyla ilgili değişiklikleri dinleyin. ChildMoved etkinlikleri, öğenin sırasının değişmesine neden olan ChildChanged etkinliğini her zaman takip eder (geçerli sıralama yönteminize göre).

ValueChanged etkinliği

Belirli bir yoldaki içeriklerde yapılan değişikliklere abone olmak için ValueChanged etkinliğini kullanabilirsiniz. Bu etkinlik, dinleyici bağlandığında bir kez ve çocuklar da dahil olmak üzere veriler her değiştiğinde tekrar tetiklenir. Etkinlik geri çağırma işlevine, alt veriler dahil olmak üzere bu 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 liderlik tablosunun 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ılırsa 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 Firebase veritabanı konumundan okuma izni yoksa okuma işlemi iptal edilebilir. DatabaseError, hatanın neden oluştuğunu gösterir.

Daha sonra, aynı yola sahip herhangi bir DatabaseReference kullanarak etkinliğin e-posta listesinden çı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.
    }

Alt etkinlikler

Alt öğe etkinlikleri, bir işlemden kaynaklanan belirli işlemlere (ör. Push() yöntemi aracılığıyla eklenen yeni bir alt öğe veya UpdateChildrenAsync() yöntemi aracılığıyla güncellenen bir alt öğe) yanıt olarak tetiklenir. Bunların her biri birlikte, veritabanındaki belirli bir düğümdeki değişiklikleri dinlemek için yararlı olabilir. Örneğin, bir oyun, aşağıdaki 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 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 ardından belirtilen yola her yeni alt öğe eklendiğinde tekrar tetiklenir. Dinleyiciye yeni alt öğenin verilerini içeren bir anlık görüntü iletilir.

ChildChanged etkinliği, bir alt düğüm değiştirildiğinde tetiklenir. Buna, alt öğelerin alt öğelerinde yapılan tüm değişiklikler de dahildir. Genellikle bir öğe listesindeki değişikliklere yanıt vermek için ChildAdded ve ChildRemoved etkinlikleriyle birlikte kullanılır. Etkinlik dinleyicisine iletilen anlık görüntü, alt öğeyle ilgili güncellenmiş verileri içerir.

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

ChildChanged etkinliği, alt öğenin yeniden sıralanmasına neden olan bir güncelleme tarafından tetiklendiğinde ChildMoved etkinliği 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 Realtime Database Query sınıfını kullanabilirsiniz. Sıralı sonucu belirli bir sonuç sayısına veya anahtar ya da değer aralığına göre de filtreleyebilirsiniz.

Verileri sıralama

Sıralı verileri almak için sonuçların nasıl sıralandığı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. Sıralama yönteminin aynı sorgu içinde birden çok kez çağrılması hata verir.

Aşağıdaki örnekte, puana göre sıralanan bir puan liderliğine 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, bir valuechanged etkinlik dinleyicisiyle birlikte kullanıldığında istemciyi, her girişin puanına göre sıralanan veritabanındaki lider 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önteminin çağrısı, sonuçların sıralanacağı alt anahtarı 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 verilerinin sıralaması 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ı belirler.
LimitToLast() Sıralı sonuç listesinin sonundan döndürülecek maksimum öğe sayısını belirler.
StartAt() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden büyük ya da bu değere eşit öğeleri döndürme
EndAt() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtar veya değerden düşük ya da ona eşit öğeleri döndürme
EqualTo() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtara veya değere eşit öğeleri döndürme

Sıralama yöntemlerinin aksine, birden fazla sınır veya aralık işlevini birleştirebilirsiniz. Örneğin, sonuçları belirli bir değer aralığına 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ını ayarlamak ü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'e kadar ChildAdded geri çağırma alırsınız. Firebase veritabanınızda 100'den az öğe depolanıyorsa her öğe için bir ChildAdded geri çağırma işlevi tetiklenir.

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

Örneğin, aşağıdaki kod bir liderlik 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() değerlerini kullanabilirsiniz. Bu, verileri sayfalara ayırmak veya belirli bir değere sahip alt öğeleri olan öğeleri bulmak için yararlı olabilir.

Sorgu verilerinin sıralama şekli

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

OrderByChild

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

  1. Belirtilen alt anahtar için null değerine sahip alt öğeler önce gelir.
  2. Ardından, belirtilen alt anahtar için false değerine sahip alt öğeler gelir. Birden fazla çocuğun değeri false ise anahtara göre alfabetik olarak sıralanır.
  3. Ardından, belirtilen alt anahtar için true değerine sahip alt öğeler gelir. Birden fazla alt öğenin değeri true ise bu öğeler anahtara göre alfabetik olarak sıralanır.
  4. Ardından, sayısal değere sahip alt öğeler artan düzende sıralanır. Belirtilen alt öğe düğümü için birden fazla alt öğenin sayısal değeri aynıysa bu öğeler anahtara göre sıralanır.
  5. Dizelerin sırası, sayılardan sonra gelir ve alfabetik olarak artan düzendedir. Belirtilen alt öğe düğümü için birden fazla alt öğe aynı değere sahipse bu öğeler anahtara göre alfabetik olarak sıralanır.
  6. Nesneler en son gelir ve anahtara göre artan düzende alfabetik 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.

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

OrderByValue

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