Veri Alma

Bu belge, veri almanın temellerini ve Firebase verilerinin nasıl sıralanıp filtreleneceğini kapsar.

Sen başlamadan önce

Gerçek Zamanlı Veritabanını kullanabilmeniz için şunları yapmanız gerekir:

  • 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ıştır.

    • 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 konsolundaki hem de açık Unity projenizdeki görevleri 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 çağrı yapılarak veya FirebaseDatabase referansındaki bir etkinliğe eklenerek alınır. Olay dinleyicisi, verinin başlangıç ​​durumu için bir kez ve veri değiştiğinde tekrar çağrılır.

Veritabanı Referansı Alın

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 okuyun

Belirli bir yoldaki içeriklerin 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...
        }
      });

Etkinlikleri dinle

Verilerdeki değişikliklere abone olmak için etkinlik 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 öğ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 tetiklenir ve çocuklar da dahil olmak üzere veriler her değiştiğinde tekrar tetiklenir. Olay geri çağrısına, 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 skor 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 anında veritabanında belirtilen konumdaki verileri içeren bir DataSnapshot içerir. Anlık görüntüde Value çağrılması, verileri temsil eden bir Dictionary<string, object> döndürür. Konumda veri yoksa Value çağrısı null değerini döndürür.

Bu örnekte args.DatabaseError da okumanın iptal edilip edilmediğini görmek için incelenir. Örneğin, istemcinin Firebase veritabanı konumundan okuma izni yoksa okuma iptal edilebilir. DatabaseError hatanın neden oluştuğunu gösterecektir.

Daha sonra aynı yola sahip herhangi bir DatabaseReference kullanarak etkinlik 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.
    }

Alt etkinlikler

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 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 Firebase veritabanındaki öğelerin listesini almak için kullanılır. ChildAdded olayı, mevcut her alt öğe için bir kez ve daha sonra 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 her değiştirildiğinde tetiklenir. Buna alt düğümün alt öğelerinde yapılan değişiklikler de dahildir. 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 öğeye ilişkin güncelleştirilmiş 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 çağrısına iletilen anlık görüntü, kaldırılan alt öğeye ilişkin verileri içerir.

ChildMoved olayı, ChildChanged olayı, alt öğenin yeniden sıralanmasına neden olan bir güncelleştirme tarafından oluşturulduğunda 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 üzere sıralama yöntemlerinden birini belirterek 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 tek bir sipariş yöntemi kullanabilirsiniz. Aynı sorguda bir sıralama yöntemini birden çok kez çağırmak hataya neden olur.

Aşağıdaki örnek, puana göre sıralanmış bir puan sıralama 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, değeri değiştirilmiş bir olay dinleyicisi ile birleştirildiğinde istemciyi, her girişin puanına göre sıralanan veritabanındaki sıralama tablosuyla senkronize eden bir sorguyu tanımlar. Verilerinizi verimli bir şekilde yapılandırma hakkında daha fazla bilgiyi Veritabanınızı Yapılandırma bölümünde okuyabilirsiniz.

OrderByChild() yöntemine yapılan çağrı, sonuçların sıralanacağı alt anahtarı belirtir. Bu durumda sonuçlar her bir 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 bkz . Sorgu verileri nasıl sıralanır ?

Verileri filtreleme

Verileri filtrelemek için, sorgu oluştururken limit veya aralık yöntemlerinden herhangi birini 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 anahtara veya değere eşit veya ondan büyük öğeleri döndürün.
EndAt() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtara veya değere eşit veya ondan küçük öğeleri döndürün.
EqualTo() Seçilen sıralama yöntemine bağlı olarak, belirtilen anahtara veya değere eşit öğeleri döndürün.

Sıralama yöntemlerinden farklı olarak birden fazla limit veya aralık fonksiyonunu 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ü hâlâ bir listedir; yalnızca tek bir öğe içerir.

Sonuç sayısını sınırlayın

Belirli bir geri çağırma için senkronize edilecek maksimum alt ç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() işlevini kullanırsanız, başlangıçta yalnızca 100'e kadar ChildAdded geri arama alırsınız. Firebase veritabanınızda depolanan öğe sayısı 100'den azsa her öğe için 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 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
    }

Anahtar veya değere göre filtrele

Sorgular için rastgele başlangıç, bitiş ve eşdeğerlik noktaları seçmek amacıyla StartAt() , EndAt() ve EqualTo() kullanabilirsiniz. Bu, verileri sayfalara ayı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ıldığında, belirtilen alt anahtarı içeren veriler şu şekilde sıralanır:

  1. Belirtilen alt anahtar için null değeri olan çocuklar önce gelir.
  2. Daha sonra belirtilen alt anahtar için false değerine sahip çocuklar gelir. Birden fazla çocuğun false değeri varsa, bunlar sözlüksel olarak anahtara göre sıralanır.
  3. Daha sonra belirtilen alt anahtar için true değeri olan çocuklar gelir. Birden fazla çocuğun true değeri varsa, bunlar sözlüksel olarak anahtara göre sıralanır.
  4. Daha sonra sayısal değeri olan çocuklar artan düzende sıralanarak gelir. Birden fazla alt öğe, belirtilen alt düğüm için aynı sayısal değere sahipse anahtara göre sıralanır.
  5. Dizeler sayılardan sonra gelir ve sözlükbilimsel olarak artan düzende sıralanır. Birden fazla alt öğe, belirtilen alt düğüm için aynı değere sahipse, bunlar sözlüksel olarak anahtara göre sıralanır.
  6. Nesneler en sonda gelir ve sözlükbilimsel olarak anahtara göre artan düzende sıralanır.

OrderByKey

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

  1. 32 bitlik bir tamsayı olarak ayrıştırılabilen bir anahtarı olan çocuklar, artan düzende sıralanarak önce gelir.
  2. Anahtarları dize değeri olan çocuklar daha sonra sözlükbilimsel olarak artan düzende sıralanır.

OrderByValue

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