Coba Cloud Firestore: Lihat database yang skalabel dan fleksibel dari Firebase dan Google Cloud Platform. Pelajari Cloud Firestore lebih lanjut.

Membaca dan Menulis 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 data

Dokumen ini mencakup dasar-dasar pengambilan data, serta cara mengurutkan dan memfilter data Firebase.

Data Firebase diambil dengan menambahkan listener asinkron ke firebase.database.Reference. Listener dipicu sekali untuk status awal data, dan dipicu kembali setiap kali data berubah.

Operasi tulis dasar

Untuk operasi tulis dasar, Anda dapat menggunakan set() untuk menyimpan data ke referensi yang ditentukan, sehingga menggantikan data yang ada di lokasi tersebut. Misalnya, aplikasi blogging sosial dapat menambahkan pengguna dengan set() sebagai berikut:

function writeUserData(userId, name, email, imageUrl) {
  firebase.database().ref('users/' + userId).set({
    username: name,
    email: email,
    profile_picture : imageUrl
  });
}

Jika set() digunakan, data akan ditimpa di lokasi yang ditentukan, termasuk semua node turunan.

Mendeteksi peristiwa nilai

Untuk membaca data di lokasi dan mendeteksi perubahan, gunakan metode on() atau once() dari firebase.database.Reference untuk mengamati peristiwa.

Peristiwa Penggunaan standar
value Membaca dan mendeteksi perubahan di seluruh konten lokasi.

Anda dapat menggunakan peristiwa value untuk membaca snapshot statis konten di lokasi tertentu, saat konten tersebut ada selama peristiwa terjadi. Metode ini terpicu 1 kali ketika listener terpasang, dan terpicu lagi setiap kali terjadi perubahan pada data, termasuk pada setiap turunannya. Callback peristiwa akan menerima snapshot yang berisi semua data di lokasi tersebut, termasuk data turunan. Jika tidak ada data, snapshot akan menampilkan false ketika Anda memanggil exists() dan null ketika Anda memanggil val() pada snapshot tersebut.

Contoh berikut menunjukkan aplikasi blogging sosial yang mengambil jumlah bintang suatu postingan dari database:

var starCountRef = firebase.database().ref('posts/' + postId + '/starCount');
starCountRef.on('value', function(snapshot) {
  updateStarCount(postElement, snapshot.val());
});

Listener menerima snapshot yang berisi data di lokasi yang ditentukan dalam database saat peristiwa terjadi. Anda dapat mengambil data dalam snapshot dengan metode val().

Membaca data sekali

Dalam beberapa kasus, Anda kemungkinan menginginkan snapshot data tanpa mendeteksi perubahan, seperti saat menginisialisasi elemen UI yang tidak diharapkan akan berubah. Anda dapat menggunakan metode once() untuk menyederhanakan skenario ini: metode ini dipicu sekali dan tidak dipicu lagi.

Cara ini berguna untuk data yang hanya perlu dimuat sekali, dan tidak diharapkan untuk sering berubah atau harus aktif mendeteksi. Misalnya, aplikasi blogging pada contoh sebelumnya menggunakan metode ini untuk memuat profil pengguna ketika mereka mulai membuat postingan baru:

var userId = firebase.auth().currentUser.uid;
return firebase.database().ref('/users/' + userId).once('value').then(function(snapshot) {
  var username = (snapshot.val() && snapshot.val().username) || 'Anonymous';
  // ...
});

Mengupdate atau menghapus data

Mengupdate kolom tertentu

Untuk melakukan penulisan ke turunan tertentu dari sebuah node secara bersamaan tanpa menimpa node turunan yang lain, gunakan metode update().

Saat memanggil update(), Anda dapat memperbarui nilai turunan pada tingkat yang lebih rendah dengan menetapkan lokasi untuk kunci tersebut. Jika data disimpan dalam beberapa lokasi agar lebih seimbang, Anda dapat mengupdate semua instance data tersebut menggunakan data fan-out.

Misalnya, aplikasi blogging sosial dapat membuat postingan dan mengupdatenya secara bersamaan ke feed aktivitas terkini dan feed aktivitas pengguna pengirim postingan menggunakan kode seperti ini:

function writeNewPost(uid, username, picture, title, body) {
  // A post entry.
  var postData = {
    author: username,
    uid: uid,
    body: body,
    title: title,
    starCount: 0,
    authorPic: picture
  };

  // Get a key for a new Post.
  var newPostKey = firebase.database().ref().child('posts').push().key;

  // Write the new post's data simultaneously in the posts list and the user's post list.
  var updates = {};
  updates['/posts/' + newPostKey] = postData;
  updates['/user-posts/' + uid + '/' + newPostKey] = postData;

  return firebase.database().ref().update(updates);
}

Contoh ini menggunakan push() untuk membuat postingan dalam node yang berisi postingan bagi semua pengguna di /posts/$postid, dan sekaligus mengambil kunci. Selanjutnya, kunci tersebut dapat digunakan untuk membuat entri kedua dalam postingan pengguna di /user-posts/$userid/$postid.

Dengan menggunakan lokasi tersebut, Anda dapat menjalankan update simultan ke beberapa lokasi di pohon JSON dengan sekali panggilan ke update(), seperti yang digunakan pada contoh ini untuk membuat postingan baru di kedua lokasi. Update simultan menjadikan proses ini berjalan menyeluruh: entah semua update berhasil atau semua update gagal.

Menambahkan Callback Penyelesaian

Jika Anda ingin tahu kapan data diubah, Anda bisa menambahkan callback penyelesaian. set() dan update() membawa callback penyelesaian opsional yang dipanggil ketika operasi tulis telah diterapkan pada database. Jika panggilan tidak berhasil, objek error akan diteruskan ke callback untuk menunjukkan penyebab kegagalan.

  firebase.database().ref('users/' + userId).set({
    username: name,
    email: email,
    profile_picture : imageUrl
  }, function(error) {
    if (error) {
      // The write failed...
    } else {
      // Data saved successfully!
    }
  });
}

Menghapus data

Cara termudah untuk menghapus data adalah dengan memanggil remove() pada referensi ke lokasi data tersebut.

Anda juga dapat menghapus dengan menentukan null sebagai nilai untuk operasi tulis lainnya seperti set() atau update(). Teknik ini dapat digunakan dengan update() untuk menghapus beberapa turunan dengan 1 panggilan API.

Menerima Promise

Untuk mengetahui kapan data dimasukkan ke server Firebase Realtime Database, Anda dapat menggunakan Promise. Baik set() dan update() dapat menghasilkan Promise, yang dapat Anda gunakan untuk mengetahui kapan penulisan dimasukkan ke database.

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.

Menyimpan data sebagai transaksi

Ketika bekerja dengan data yang bisa rusak karena perubahan serentak, seperti penghitung tambahan, Anda dapat menggunakan operasi transaksi. Anda dapat memberi operasi ini fungsi update dan callback penyelesaian opsional. Fungsi update mengambil kondisi data saat ini sebagai argumen, dan akan menampilkan kondisi baru yang diinginkan untuk Anda tulis. Jika klien lainnya melakukan penulisan ke lokasi sebelum nilai baru Anda berhasil ditulis, fungsi update Anda akan dipanggil lagi dengan nilai baru saat ini, dan proses tulis akan dicoba ulang.

Misalnya, pada contoh aplikasi blogging sosial, Anda dapat mengizinkan pengguna memberi bintang atau menghapus bintang pada postingan, serta mengetahui berapa banyak bintang yang telah diterima suatu postingan dengan cara berikut ini:

function toggleStar(postRef, uid) {
  postRef.transaction(function(post) {
    if (post) {
      if (post.stars && post.stars[uid]) {
        post.starCount--;
        post.stars[uid] = null;
      } else {
        post.starCount++;
        if (!post.stars) {
          post.stars = {};
        }
        post.stars[uid] = true;
      }
    }
    return post;
  });
}

Penggunaan transaksi dapat mencegah kesalahan penghitungan jumlah bintang jika beberapa pengguna memberi bintang pada postingan yang sama secara bersamaan, atau jika klien memiliki data yang sudah usang. Jika transaksi ditolak, server akan menampilkan nilai saat ini ke klien, yang akan mengulangi transaksi tersebut dengan nilai yang telah diupdate. Proses ini akan berulang sampai transaksi diterima atau Anda membatalkan transaksi.

Menulis data secara offline

Jika koneksi jaringan klien terputus, aplikasi Anda akan tetap berfungsi dengan baik.

Setiap klien yang terhubung ke database Firebase menyimpan versi internalnya sendiri dari setiap data aktif. Ketika ditulis, data akan dituliskan ke versi lokal ini terlebih dahulu. Selanjutnya, klien Firebase menyinkronkan data tersebut dengan server database di tempat lain, dan dengan klien lain berdasarkan "upaya terbaik".

Akibatnya, semua operasi tulis ke database akan segera memicu peristiwa lokal, sebelum ada data yang dituliskan ke server. Ini berarti aplikasi Anda akan tetap responsif, apa pun kondisi latensi atau konektivitas jaringannya.

Setelah konektivitas pulih, aplikasi Anda akan menerima kumpulan peristiwa yang tepat, sehingga klien akan sinkron dengan kondisi server saat ini, tanpa perlu menulis kode kustom apa pun.

Langkah berikutnya

Kirim masukan tentang...

Firebase Realtime Database
Butuh bantuan? Kunjungi halaman dukungan kami.