Ikuti semua informasi yang diumumkan di Firebase Summit, dan pelajari bagaimana Firebase dapat membantu Anda mempercepat pengembangan aplikasi dan menjalankan aplikasi dengan percaya diri. Pelajari Lebih Lanjut

Mengambil Data

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Dokumen ini mencakup dasar-dasar pengambilan data dan cara memesan dan memfilter data Firebase.

Sebelum kamu memulai

Sebelum Anda dapat menggunakan Realtime Database , Anda perlu:

  • Daftarkan proyek Unity Anda dan konfigurasikan untuk menggunakan Firebase.

    • Jika proyek Unity Anda sudah menggunakan Firebase, maka proyek tersebut sudah terdaftar dan dikonfigurasi untuk Firebase.

    • Jika Anda tidak memiliki proyek Unity, Anda dapat mengunduh aplikasi sampel .

  • Tambahkan Firebase Unity SDK (khususnya, FirebaseDatabase.unitypackage ) ke proyek Unity Anda.

Perhatikan bahwa menambahkan Firebase ke proyek Unity Anda melibatkan tugas di Firebase console dan di proyek Unity terbuka Anda (misalnya, Anda mengunduh file konfigurasi Firebase dari konsol, lalu memindahkannya ke proyek Unity Anda).

Mengambil Data

Data Firebase diambil dengan panggilan satu kali ke GetValueAsync() atau melampirkan ke peristiwa pada referensi FirebaseDatabase . Event listener dipanggil sekali untuk status awal data dan dipanggil lagi kapan pun data berubah.

Dapatkan Referensi Basis Data

Untuk membaca data dari database, Anda memerlukan instance DatabaseReference :

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;
  }
}

Baca data sekali

Anda dapat menggunakan metode GetValueAsync untuk membaca snapshot statis konten pada jalur yang diberikan satu kali. Hasil tugas akan berisi snapshot yang berisi semua data di lokasi tersebut, termasuk data anak. Jika tidak ada data, snapshot yang dikembalikan adalah null .

    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...
        }
      });

Dengarkan acara

Anda dapat menambahkan pendengar acara untuk berlangganan pada perubahan data:

Peristiwa Penggunaan umum
ValueChanged Baca dan dengarkan perubahan pada seluruh konten jalur.
ChildAdded Ambil daftar item atau dengarkan penambahan ke daftar item. Penggunaan yang disarankan dengan ChildChanged dan ChildRemoved untuk memantau perubahan pada daftar.
ChildChanged Dengarkan perubahan pada item dalam daftar. Gunakan dengan ChildAdded dan ChildRemoved untuk memantau perubahan pada daftar.
ChildRemoved Dengarkan item yang dihapus dari daftar. Gunakan dengan ChildAdded dan ChildChanged untuk memantau perubahan pada daftar.
ChildMoved Dengarkan perubahan urutan item dalam daftar yang dipesan. Event ChildMoved selalu mengikuti event ChildChanged yang menyebabkan urutan item berubah (berdasarkan metode order-by Anda saat ini).

Acara yang Bernilai Berubah

Anda dapat menggunakan acara ValueChanged untuk berlangganan perubahan konten di jalur tertentu. Peristiwa ini dipicu satu kali saat listener terpasang dan dipicu lagi setiap kali data, termasuk turunan, berubah. Callback peristiwa melewati snapshot yang berisi semua data di lokasi itu, termasuk data turunan. Jika tidak ada data, snapshot yang dikembalikan adalah null .

Contoh berikut menunjukkan permainan yang mengambil skor papan peringkat dari database:

      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 berisi DataSnapshot yang berisi data di lokasi yang ditentukan dalam database pada saat kejadian. Memanggil Value pada snapshot mengembalikan Dictionary<string, object> yang mewakili data. Jika tidak ada data di lokasi, memanggil Value mengembalikan null .

Dalam contoh ini, args.DatabaseError juga diperiksa untuk melihat apakah pembacaan dibatalkan. Misalnya, pembacaan dapat dibatalkan jika klien tidak memiliki izin untuk membaca dari lokasi database Firebase. DatabaseError akan menunjukkan mengapa kegagalan terjadi.

Nanti Anda dapat berhenti berlangganan dari acara menggunakan DatabaseReference apa pun yang memiliki jalur yang sama. DatabaseReference bersifat sementara dan dapat dianggap sebagai cara untuk mengakses jalur dan kueri apa pun.

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

Acara anak

Peristiwa turunan dipicu sebagai respons terhadap operasi tertentu yang terjadi pada turunan simpul dari operasi seperti turunan baru yang ditambahkan melalui metode Push() atau turunan yang diperbarui melalui metode UpdateChildrenAsync() . Masing-masing bersama-sama dapat berguna untuk mendengarkan perubahan ke node tertentu dalam database. Misalnya, sebuah game mungkin menggunakan metode ini bersama-sama untuk memantau aktivitas di komentar sesi game, seperti yang ditunjukkan di bawah ini:

      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
    }

Peristiwa ChildAdded biasanya digunakan untuk mengambil daftar item dalam database Firebase. Acara ChildAdded dimunculkan sekali untuk setiap anak yang ada dan kemudian lagi setiap kali anak baru ditambahkan ke jalur yang ditentukan. Listener diberikan snapshot yang berisi data anak baru.

Acara ChildChanged dimunculkan setiap kali node anak dimodifikasi. Ini termasuk modifikasi apa pun pada turunan dari simpul anak. Ini biasanya digunakan bersama dengan peristiwa ChildAdded dan ChildRemoved untuk merespons perubahan pada daftar item. Cuplikan yang diteruskan ke event listener berisi data yang diperbarui untuk turunan.

Acara ChildRemoved dipicu saat anak langsung dihapus. Ini biasanya digunakan bersama dengan panggilan balik ChildAdded dan ChildChanged . Cuplikan yang diteruskan ke panggilan balik peristiwa berisi data untuk turunan yang dihapus.

Peristiwa ChildMoved dipicu setiap kali peristiwa ChildChanged dimunculkan oleh pembaruan yang menyebabkan pengurutan ulang anak. Ini digunakan dengan data yang dipesan dengan OrderByChild atau OrderByValue .

Menyortir dan memfilter data

Anda dapat menggunakan kelas Realtime Database Query untuk mengambil data yang diurutkan berdasarkan kunci, nilai, atau nilai turunan. Anda juga dapat memfilter hasil yang diurutkan ke sejumlah hasil tertentu atau rentang kunci atau nilai.

Urutkan data

Untuk mengambil data yang diurutkan, mulailah dengan menentukan salah satu metode order-by untuk menentukan bagaimana hasil diurutkan:

metode Penggunaan
OrderByChild() Urutan hasil berdasarkan nilai kunci turunan yang ditentukan.
OrderByKey() Urutan hasil dengan kunci anak.
OrderByValue() Urutan hasil berdasarkan nilai turunan.

Anda hanya dapat menggunakan satu metode order-by pada satu waktu. Memanggil metode order-by beberapa kali dalam kueri yang sama akan menimbulkan kesalahan.

Contoh berikut menunjukkan bagaimana Anda dapat berlangganan papan peringkat skor yang diurutkan berdasarkan skor.

      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
    }

Ini mendefinisikan kueri yang bila digabungkan dengan pendengar peristiwa yang diubah nilainya akan menyinkronkan klien dengan papan peringkat dalam database, yang diurutkan berdasarkan skor setiap entri. Anda dapat membaca lebih lanjut tentang menyusun data Anda secara efisien di Structure Your Database .

Panggilan ke metode OrderByChild() menetapkan kunci turunan untuk mengurutkan hasil. Dalam hal ini, hasil diurutkan berdasarkan nilai nilai "score" pada setiap anak. Untuk informasi selengkapnya tentang bagaimana tipe data lain diurutkan, lihat Bagaimana data kueri diurutkan .

Memfilter data

Untuk memfilter data, Anda bisa menggabungkan salah satu metode batas atau rentang dengan metode urutkan menurut saat membuat kueri.

metode Penggunaan
LimitToFirst() Menetapkan jumlah maksimum item yang akan dikembalikan dari awal daftar hasil yang diurutkan.
LimitToLast() Menetapkan jumlah maksimum item yang akan dikembalikan dari akhir daftar hasil yang diurutkan.
StartAt() Kembalikan item yang lebih besar dari atau sama dengan kunci atau nilai yang ditentukan tergantung pada metode urutkan berdasarkan yang dipilih.
EndAt() Kembalikan item kurang dari atau sama dengan kunci atau nilai yang ditentukan tergantung pada metode urutkan berdasarkan yang dipilih.
EqualTo() Kembalikan item sama dengan kunci atau nilai yang ditentukan tergantung pada metode urutkan berdasarkan yang dipilih.

Berbeda dengan metode order-by, Anda dapat menggabungkan beberapa fungsi limit atau range. Misalnya, Anda dapat menggabungkan metode StartAt() dan EndAt() untuk membatasi hasil ke rentang nilai tertentu.

Bahkan ketika hanya ada satu kecocokan untuk kueri, snapshot masih berupa daftar; itu hanya berisi satu item.

Batasi jumlah hasil

Anda dapat menggunakan metode LimitToFirst() dan LimitToLast() untuk menyetel jumlah maksimum turunan yang akan disinkronkan untuk callback tertentu. Misalnya, jika Anda menggunakan LimitToFirst() untuk menetapkan batas 100, awalnya Anda hanya menerima hingga 100 panggilan balik ChildAdded . Jika Anda memiliki kurang dari 100 item yang disimpan di database Firebase, callback ChildAdded akan diaktifkan untuk setiap item.

Saat item berubah, Anda menerima callback ChildAdded untuk item yang masuk ke kueri dan callback ChildRemoved untuk item yang keluar darinya sehingga jumlah total tetap 100.

Misalnya, kode di bawah ini mengembalikan skor teratas dari papan peringkat:

      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
    }

Filter menurut kunci atau nilai

Anda dapat menggunakan StartAt() , EndAt() , dan EqualTo() untuk memilih titik awal, akhir, dan ekivalensi arbitrer untuk kueri. Ini dapat berguna untuk membuat paginasi data atau menemukan item dengan turunan yang memiliki nilai tertentu.

Bagaimana data kueri dipesan

Bagian ini menjelaskan bagaimana data diurutkan menurut masing-masing metode urutkan menurut di kelas Query .

OrderByChild

Saat menggunakan OrderByChild() , data yang berisi kunci anak yang ditentukan akan diurutkan sebagai berikut:

  1. Anak-anak dengan nilai null untuk kunci anak yang ditentukan didahulukan.
  2. Anak-anak dengan nilai false untuk kunci anak yang ditentukan datang berikutnya. Jika beberapa anak memiliki nilai false , mereka diurutkan secara leksikografis berdasarkan kunci.
  3. Anak-anak dengan nilai true untuk kunci anak yang ditentukan datang berikutnya. Jika beberapa anak memiliki nilai true , mereka diurutkan secara leksikografis berdasarkan kunci.
  4. Anak-anak dengan nilai numerik datang berikutnya, diurutkan dalam urutan menaik. Jika beberapa anak memiliki nilai numerik yang sama untuk simpul anak yang ditentukan, mereka diurutkan berdasarkan kunci.
  5. String datang setelah angka dan diurutkan secara leksikografis dalam urutan menaik. Jika beberapa anak memiliki nilai yang sama untuk simpul anak yang ditentukan, mereka diurutkan secara leksikografis berdasarkan kunci.
  6. Objek datang terakhir dan diurutkan secara leksikografis berdasarkan kunci dalam urutan menaik.

OrderByKey

Saat menggunakan OrderByKey() untuk mengurutkan data Anda, data dikembalikan dalam urutan menaik berdasarkan kunci.

  1. Anak-anak dengan kunci yang dapat diuraikan sebagai bilangan bulat 32-bit didahulukan, diurutkan dalam urutan menaik.
  2. Anak-anak dengan nilai string sebagai kunci mereka datang berikutnya, diurutkan secara leksikografis dalam urutan menaik.

OrderByValue

Saat menggunakan OrderByValue() , anak-anak diurutkan berdasarkan nilainya. Kriteria pengurutan sama seperti di OrderByChild() , kecuali nilai simpul yang digunakan sebagai ganti nilai kunci anak yang ditentukan.