Buka konsol

Menangani Daftar Data di Web

Mendapatkan referensi database

Untuk membaca atau menulis data dari database, Anda memerlukan instance firebase.database.Reference:

// Get a reference to the database service
var database = firebase.database();

Membaca dan menulis daftar

Menambahkan ke daftar data

Gunakan metode push() untuk menambahkan data ke daftar dalam aplikasi multipengguna. Metode push() menghasilkan kunci unik setiap kali turunan baru ditambahkan ke referensi Firebase tertentu. Dengan menggunakan kunci yang dihasilkan secara otomatis untuk setiap elemen baru dalam daftar, beberapa klien dapat menambahkan turunan ke lokasi yang sama secara bersamaan tanpa konflik tulis. Kunci unik yang dihasilkan oleh push() didasarkan pada stempel waktu, sehingga item daftar diurutkan otomatis secara kronologis.

Anda dapat menggunakan referensi ke data baru yang ditampilkan oleh metode push() untuk mendapatkan nilai kunci turunan yang otomatis dihasilkan atau data kumpulan untuk turunan. Properti .key dari referensi push() berisi kunci yang dihasilkan otomatis.

Anda dapat menggunakan kunci yang dihasilkan secara otomatis ini untuk mempermudah perataan struktur data. Untuk informasi lebih lanjut, lihat contoh data fan-out.

Misalnya, push() dapat digunakan untuk menambahkan postingan baru ke daftar postingan dalam aplikasi sosial:

// Create a new post reference with an auto-generated id
var newPostRef = postListRef.push();
newPostRef.set({
    // ...
});

Mendeteksi peristiwa turunan

Peristiwa turunan dipicu sebagai respons terhadap operasi tertentu yang terjadi pada turunan node dari suatu operasi, seperti turunan baru yang ditambahkan melalui metode push() atau turunan yang sedang diupdate melalui metode update().

Peristiwa Penggunaan standar
child_added Mengambil daftar item atau mendeteksi penambahan daftar item. Peristiwa ini dipicu 1 kali untuk setiap turunan yang ada, dan dipicu lagi setiap kali ada turunan baru yang ditambahkan ke lokasi yang ditetapkan. Snapshot yang berisi data turunan baru diteruskan ke listener.
child_changed Mendeteksi perubahan pada item dalam daftar. Peristiwa ini dipicu setiap kali node turunan diubah. Ini juga termasuk perubahan keturunan dari node turunan. Snapshot yang diteruskan ke listener peristiwa berisi data turunan yang diupdate.
child_removed Mendeteksi item yang sedang dihapus dari daftar. Peristiwa ini dipicu ketika turunan langsung dihapus.Snapshot yang diteruskan ke pemblokiran callback berisi data turunan yang dihapus.
child_moved Mendeteksi perubahan pada urutan item dalam daftar berurut. Peristiwa child_moved selalu mengikuti peristiwa child_changed, yang menyebabkan urutan item berubah (berdasarkan metode 'urutkan berdasarkan' saat ini).

Secara bersama-sama, setiap metode ini dapat berguna untuk mendeteksi perubahan terhadap node tertentu dalam database. Misalnya, aplikasi blog sosial mungkin menggunakan metode ini secara bersamaan untuk memantau aktivitas dalam komentar postingan, seperti yang ditunjukkan di bawah ini:

var commentsRef = firebase.database().ref('post-comments/' + postId);
commentsRef.on('child_added', function(data) {
  addCommentElement(postElement, data.key, data.val().text, data.val().author);
});

commentsRef.on('child_changed', function(data) {
  setCommentValues(postElement, data.key, data.val().text, data.val().author);
});

commentsRef.on('child_removed', function(data) {
  deleteComment(postElement, data.key);
});

Mendeteksi peristiwa nilai

Meskipun mendeteksi peristiwa turunan adalah cara yang disarankan untuk membaca daftar data, mendeteksi peristiwa nilai di referensi daftar dapat pula bermanfaat.

Menyertakan observer value ke daftar data akan menampilkan keseluruhan daftar data sebagai snapshot tunggal, yang nantinya dapat di-loop untuk mengakses masing-masing turunan.

Meskipun hanya ada 1 kecocokan untuk kueri, snapshot tetaplah sebuah daftar yang hanya berisi 1 item. Untuk mengakses item tersebut, Anda harus melakukan loop pada hasil:

ref.once('value', function(snapshot) {
  snapshot.forEach(function(childSnapshot) {
    var childKey = childSnapshot.key;
    var childData = childSnapshot.val();
    // ...
  });
});

Pola ini dapat bermanfaat ketika Anda ingin mengambil semua turunan dari daftar dalam 1 operasi, dan bukannya mendeteksi peristiwa penambahan turunan lain.

Mengurutkan dan memfilter data

Anda bisa menggunakan class Query Realtime Database untuk memperoleh data yang diurutkan berdasarkan kunci, nilai, atau nilai turunan. Anda juga dapat memfilter hasil pengurutan ke jumlah hasil tertentu atau ke rentang kunci atau nilai.

Mengurutkan data

Untuk mengambil data yang diurutkan, mulai dengan menentukan salah satu metode 'urutkan berdasarkan' untuk menentukan cara pengurutan hasil.

Metode Penggunaan
orderByChild() Mengurutkan hasil berdasarkan nilai kunci turunan yang ditentukan atau lokasi turunan bertingkat.
orderByKey() Mengurutkan hasil berdasarkan kunci turunan.
orderByValue() Mengurutkan hasil berdasarkan nilai turunan.

Anda hanya bisa menggunakan 1 metode 'urutkan berdasarkan' pada satu waktu. Memanggil metode 'urutkan berdasarkan' beberapa kali dalam 1 kueri akan menyebabkan error.

Contoh berikut menunjukkan cara mengambil daftar postingan teratas milik pengguna yang diurutkan berdasarkan jumlah bintangnya:

var myUserId = firebase.auth().currentUser.uid;
var topUserPostsRef = firebase.database().ref('user-posts/' + myUserId).orderByChild('starCount');

Ini menentukan kueri yang, jika dikombinasikan dengan listener turunan, akan menyinkronkan klien dengan postingan pengguna dari lokasi dalam database berdasarkan ID penggunanya, yang diurutkan berdasarkan jumlah bintang yang diterima setiap postingan. Teknik penggunaan ID sebagai kunci indeks ini disebut fan-out data. Anda dapat membaca lebih lanjut tentang hal ini di bagian Membuat Struktur Database Anda.

Panggilan ke metode orderByChild() menetapkan kunci turunan sebagai dasar untuk mengurutkan hasil. Dalam kasus ini, postingan diurutkan berdasarkan nilai turunan "starCount" masing-masing. Kueri juga dapat diurutkan berdasarkan turunan bertingkat, jika Anda memiliki data yang tampak seperti ini:

"posts": {
  "ts-functions": {
    "metrics": {
      "views" : 1200000,
      "likes" : 251000,
      "shares": 1200,
    },
    "title" : "Why you should use TypeScript for writing Cloud Functions",
    "author": "Doug",
  },
  "android-arch-3": {
    "metrics": {
      "views" : 900000,
      "likes" : 117000,
      "shares": 144,
    },
    "title" : "Using Android Architecture Components with Firebase Realtime Database (Part 3)",
    "author": "Doug",
  }
},

Dalam kasus ini, kita dapat mengurutkan elemen daftar berdasarkan nilai yang bertingkat dalam kunci metrics dengan menentukan lokasi relatif ke turunan bertingkat pada panggilan orderByChild().

 
var mostViewedPosts = firebase.database().ref('posts').orderByChild('metrics/views');

Untuk informasi lebih lanjut mengenai metode pengurutan jenis data lainnya, lihat Metode pengurutan data kueri.

Memfilter data

Untuk memfilter data, Anda dapat menggabungkan salah satu metode batas atau rentang dengan metode 'urutkan berdasarkan' ketika menyusun kueri.

Metode Penggunaan
limitToFirst() Menetapkan jumlah item maksimum untuk ditampilkan dari awal daftar hasil yang diurutkan.
limitToLast() Menetapkan jumlah item maksimum untuk ditampilkan dari akhir daftar hasil yang diurutkan.
startAt() Menampilkan item yang lebih besar atau sama dengan kunci atau nilai yang ditentukan, tergantung metode 'urutkan berdasarkan' yang dipilih.
endAt() Menampilkan item yang lebih kecil atau sama dengan kunci atau nilai yang ditentukan, tergantung metode 'urutkan berdasarkan' yang dipilih.
equalTo() Menampilkan item yang sama dengan kunci atau nilai yang ditentukan, tergantung metode 'urutkan berdasarkan' yang dipilih.

Berbeda dengan metode 'urutkan berdasarkan', Anda dapat menggabungkan beberapa fungsi batas atau rentang. Misalnya, Anda dapat menggabungkan metode startAt() dan endAt() untuk membatasi hasil terhadap rentang nilai tertentu.

Membatasi jumlah hasil

Anda dapat menggunakan metode limitToFirst() dan limitToLast() untuk menetapkan jumlah turunan maksimal yang akan disinkronkan untuk peristiwa tertentu. Misalnya, jika Anda menggunakan limitToFirst() untuk menetapkan batas 100, pada awalnya Anda hanya akan menerima hingga 100 peristiwa child_added. Jika Anda memiliki kurang dari 100 item tersimpan dalam database Firebase, peristiwa child_added akan dijalankan untuk setiap item.

Saat item berubah, Anda menerima peristiwa child_added untuk item yang masuk ke kueri dan peristiwa child_removed untuk item yang keluar, sehingga jumlah totalnya tetap 100.

Contoh berikut menunjukkan cara aplikasi blog menentukan kueri untuk mengambil daftar dari 100 postingan terbaru oleh semua pengguna:

var recentPostsRef = firebase.database().ref('posts').limitToLast(100);

Contoh ini hanya menetapkan kueri, yang harus memiliki listener untuk benar-benar menyinkronkan data.

Filter berdasarkan kunci atau nilai

Anda dapat menggunakan startAt(), endAt(), dan equalTo() untuk memilih titik awal, akhir, dan ekuivalen yang arbitrer untuk kueri. Hal ini dapat bermanfaat untuk pemberian nomor data atau menemukan item dengan turunan yang memiliki nilai tertentu.

Cara data kueri diurutkan

Bagian ini menjelaskan cara data diurutkan menggunakan setiap metode 'urutkan berdasarkan' di class Query.

orderByChild

Ketika menggunakan orderByChild(), data yang berisi kunci turunan yang ditentukan diurutkan sebagai berikut:

  1. Turunan yang memiliki nilai null untuk kunci turunan yang ditentukan akan muncul pertama.
  2. Turunan yang memiliki nilai false untuk kunci turunan yang ditentukan akan muncul berikutnya. Jika beberapa turunan memiliki nilai false, turunan tersebut akan diurutkan secara leksikografis berdasarkan kunci.
  3. Turunan yang memiliki nilai true untuk kunci turunan yang ditentukan akan muncul berikutnya. Jika beberapa turunan memiliki nilai true, turunan tersebut akan diurutkan secara leksikografis berdasarkan kunci.
  4. Turunan dengan nilai numerik akan muncul berikutnya, dan diurutkan dalam urutan menaik. Jika beberapa turunan memiliki nilai numerik yang sama untuk node turunan yang ditentukan, turunan tersebut akan diurutkan berdasarkan kunci.
  5. String muncul setelah angka, dan diurutkan secara leksikografis dalam urutan menaik. Jika beberapa turunan memiliki nilai yang sama untuk node turunan yang ditentukan, turunan tersebut akan diurutkan secara leksikografis berdasarkan kunci.
  6. Objek muncul terakhir, dan diurutkan secara leksikografis berdasarkan kunci dalam urutan menaik.

orderByKey

Ketika menggunakan orderByKey() untuk mengurutkan data, data akan ditampilkan dalam urutan menaik berdasarkan kunci.

  1. Turunan dengan kunci yang bisa diurai sebagai bilangan bulat 32-bit berada di urutan atas, diurutkan dalam urutan menaik.
  2. Turunan dengan nilai string sebagai kuncinya berada di urutan berikutnya, diurutkan secara leksikografis dalam urutan menaik.

orderByValue

Ketika menggunakan orderByValue(), turunan akan diurutkan berdasarkan nilainya. Kriteria urutan sama seperti di orderByChild(), perbedaannya yaitu yang digunakan adalah nilai node, bukan nilai kunci turunan yang ditentukan.

Melepas listener

Callback dihapus dengan memanggil metode off() pada referensi database Firebase.

Anda dapat menghapus 1 listener dengan meneruskannya sebagai parameter ke off(). Memanggil off() pada lokasi tanpa argumen akan menghapus semua listener yang ada di lokasi tersebut.

Memanggil off() pada listener induk tidak akan menghapus listener yang terdaftar pada node turunannya secara otomatis; off() juga harus dipanggil pada listener turunan mana pun untuk menghapus callback.

Langkah berikutnya