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

Bekerja dengan Daftar Data di platform Apple

Dapatkan Referensi FIRDatabase

Untuk membaca atau menulis data dari database, Anda memerlukan instance FIRDatabaseReference :

Cepat

Catatan: Produk Firebase ini tidak tersedia di target Cuplikan Aplikasi.
var ref: DatabaseReference!

ref = Database.database().reference()

Objective-C

Catatan: Produk Firebase ini tidak tersedia di target Cuplikan Aplikasi.
@property (strong, nonatomic) FIRDatabaseReference *ref;

self.ref = [[FIRDatabase database] reference];

Daftar bacaan dan tulisan

Tambahkan ke daftar data

Gunakan metode childByAutoId untuk menambahkan data ke daftar di aplikasi multipengguna. Metode childByAutoId menghasilkan kunci unik setiap kali anak baru ditambahkan ke referensi Firebase yang ditentukan. Dengan menggunakan kunci yang dihasilkan secara otomatis ini untuk setiap elemen baru dalam daftar, beberapa klien dapat menambahkan turunan ke lokasi yang sama pada waktu yang sama tanpa konflik penulisan. Kunci unik yang dihasilkan oleh childByAutoId didasarkan pada stempel waktu, sehingga item daftar diurutkan secara otomatis secara kronologis.

Anda dapat menggunakan referensi ke data baru yang dikembalikan oleh metode childByAutoId untuk mendapatkan nilai dari kunci anak yang dihasilkan secara otomatis atau mengatur data untuk anak tersebut. Memanggil getKey pada referensi childByAutoId mengembalikan kunci yang dibuat secara otomatis.

Anda dapat menggunakan kunci yang dihasilkan secara otomatis ini untuk menyederhanakan perataan struktur data Anda. Untuk informasi selengkapnya, lihat contoh penyebaran data .

Dengarkan acara anak

Peristiwa anak dipicu sebagai respons terhadap operasi tertentu yang terjadi pada anak node dari operasi seperti anak baru yang ditambahkan melalui metode childByAutoId atau anak yang diperbarui melalui metode updateChildValues .

Jenis acara Penggunaan tipikal
FIRDataEventTypeChildAdded Ambil daftar item atau dengarkan penambahan ke daftar item. Acara ini dipicu sekali untuk setiap anak yang ada dan dipicu lagi setiap kali anak baru ditambahkan ke jalur yang ditentukan. Pendengar diberikan snapshot yang berisi data anak baru.
FIRDataEventTypeChildChanged Dengarkan perubahan pada item dalam daftar. Acara ini dipicu setiap kali simpul anak dimodifikasi. Ini termasuk modifikasi apa pun pada keturunan simpul anak. Cuplikan yang diteruskan ke pendengar acara berisi data yang diperbarui untuk anak tersebut.
FIRDataEventTypeChildRemoved Dengarkan item yang dihapus dari daftar. Peristiwa ini dipicu saat anak langsung dihapus. Snapshot yang diteruskan ke blok callback berisi data untuk anak yang dihapus.
FIRDataEventTypeChildMoved Dengarkan perubahan pada urutan item dalam daftar yang diurutkan. Acara ini dipicu setiap kali pembaruan menyebabkan penataan ulang anak. Ini digunakan dengan data yang diurutkan oleh queryOrderedByChild atau queryOrderedByValue .

Masing-masing bersama-sama dapat berguna untuk mendengarkan perubahan pada node tertentu dalam database. Misalnya, aplikasi blogging sosial mungkin menggunakan metode ini bersama-sama untuk memantau aktivitas di komentar postingan, seperti yang ditunjukkan di bawah ini:

Cepat

Catatan: Produk Firebase ini tidak tersedia di target Cuplikan Aplikasi.
// Listen for new comments in the Firebase database
commentsRef.observe(.childAdded, with: { (snapshot) -> Void in
  self.comments.append(snapshot)
  self.tableView.insertRows(
    at: [IndexPath(row: self.comments.count - 1, section: self.kSectionComments)],
    with: UITableView.RowAnimation.automatic
  )
})
// Listen for deleted comments in the Firebase database
commentsRef.observe(.childRemoved, with: { (snapshot) -> Void in
  let index = self.indexOfMessage(snapshot)
  self.comments.remove(at: index)
  self.tableView.deleteRows(
    at: [IndexPath(row: index, section: self.kSectionComments)],
    with: UITableView.RowAnimation.automatic
  )
})

Objective-C

Catatan: Produk Firebase ini tidak tersedia di target Cuplikan Aplikasi.
// Listen for new comments in the Firebase database
[_commentsRef
              observeEventType:FIRDataEventTypeChildAdded
              withBlock:^(FIRDataSnapshot *snapshot) {
                [self.comments addObject:snapshot];
                [self.tableView insertRowsAtIndexPaths:@[
                  [NSIndexPath indexPathForRow:self.comments.count - 1 inSection:kSectionComments]
                ]
                                      withRowAnimation:UITableViewRowAnimationAutomatic];
              }];
// Listen for deleted comments in the Firebase database
[_commentsRef
 observeEventType:FIRDataEventTypeChildRemoved
 withBlock:^(FIRDataSnapshot *snapshot) {
   int index = [self indexOfMessage:snapshot];
   [self.comments removeObjectAtIndex:index];
   [self.tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:index inSection:kSectionComments]]
                         withRowAnimation:UITableViewRowAnimationAutomatic];
 }];

Dengarkan peristiwa nilai

Meskipun mendengarkan peristiwa anak adalah cara yang disarankan untuk membaca daftar data, ada beberapa situasi mendengarkan peristiwa nilai pada referensi daftar berguna.

Melampirkan pengamat FIRDataEventTypeValue ke daftar data akan mengembalikan seluruh daftar data sebagai DataSnapshot tunggal, yang kemudian dapat Anda ulangi untuk mengakses masing-masing anak.

Meskipun hanya ada satu kecocokan untuk kueri, snapshot tetap berupa daftar; itu hanya berisi satu item. Untuk mengakses item, Anda perlu mengulangi hasilnya:

Cepat

Catatan: Produk Firebase ini tidak tersedia di target Cuplikan Aplikasi.
_commentsRef.observe(.value) { snapshot in
  for child in snapshot.children {
    ...
  }
}

Objective-C

Catatan: Produk Firebase ini tidak tersedia di target Cuplikan Aplikasi.
[_commentsRef
              observeEventType:FIRDataEventTypeValue
              withBlock:^(FIRDataSnapshot *snapshot) {
                // Loop over children
                NSEnumerator *children = [snapshot children];
                FIRDataSnapshot *child;
                while (child = [children nextObject]) {
                  // ...
                }
              }];

Pola ini dapat berguna saat Anda ingin mengambil semua turunan dari daftar dalam satu operasi, daripada mendengarkan acara tambahan turunan.

Menyortir dan memfilter data

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

Sortir data

Untuk mengambil data yang diurutkan, mulailah dengan menentukan salah satu metode urutkan demi untuk menentukan bagaimana hasil diurutkan:

metode Penggunaan
queryOrderedByKey Urutan hasil dengan kunci anak.
queryOrderedByValue Urutkan hasil berdasarkan nilai anak.
queryOrderedByChild Urutkan hasil berdasarkan nilai kunci anak tertentu atau jalur anak bersarang.

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 mengambil daftar postingan teratas pengguna yang diurutkan berdasarkan jumlah bintangnya:

Cepat

Catatan: Produk Firebase ini tidak tersedia di target Cuplikan Aplikasi.
// My top posts by number of stars
let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")

Objective-C

Catatan: Produk Firebase ini tidak tersedia di target Cuplikan Aplikasi.
// My top posts by number of stars
FIRDatabaseQuery *myTopPostsQuery = [[[self.ref child:@"user-posts"]
                                      child:[super getUid]]
                                     queryOrderedByChild:@"starCount"];

Kueri ini mengambil kiriman pengguna dari jalur di database berdasarkan ID pengguna mereka, diurutkan berdasarkan jumlah bintang yang diterima setiap kiriman. Teknik menggunakan ID sebagai kunci indeks ini disebut data fan out, Anda dapat membacanya lebih lanjut di Structure Your Database .

Panggilan ke metode queryOrderedByChild menentukan kunci anak untuk mengurutkan hasil. Dalam contoh ini, postingan diurutkan berdasarkan nilai "starCount" di setiap postingan. Kueri juga dapat diurutkan berdasarkan turunan bersarang, jika Anda memiliki data yang terlihat 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 hal ini, kita dapat mengurutkan elemen daftar kita berdasarkan nilai yang bersarang di bawah kunci metrics dengan menentukan jalur relatif ke anak bersarang dalam panggilan queryOrderedByChild kita.

Cepat

Catatan: Produk Firebase ini tidak tersedia di target Cuplikan Aplikasi.
 
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")

Objective-C

Catatan: Produk Firebase ini tidak tersedia di target Cuplikan Aplikasi.
 
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];

Untuk informasi selengkapnya tentang cara pengurutan tipe data lainnya, lihat Cara pengurutan data kueri .

Menyaring data

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

metode Penggunaan
queryLimitedToFirst Menetapkan jumlah item maksimum yang akan dikembalikan dari awal daftar hasil yang diurutkan.
queryLimitedToLast Menetapkan jumlah item maksimum yang akan dikembalikan dari akhir daftar hasil yang diurutkan.
queryStartingAtValue Mengembalikan item yang lebih besar atau sama dengan kunci atau nilai yang ditentukan, bergantung pada metode urutkan menurut yang dipilih.
queryStartingAfterValue Mengembalikan item yang lebih besar dari kunci atau nilai yang ditentukan, bergantung pada metode urutkan menurut yang dipilih.
queryEndingAtValue Mengembalikan item yang kurang dari atau sama dengan kunci atau nilai yang ditentukan, bergantung pada metode urutkan menurut yang dipilih.
queryEndingBeforeValue Mengembalikan item kurang dari kunci atau nilai yang ditentukan, bergantung pada metode urutkan menurut yang dipilih.
queryEqualToValue Mengembalikan item yang sama dengan kunci atau nilai yang ditentukan, bergantung pada metode urutkan menurut yang dipilih.

Berbeda dengan metode order-by, Anda dapat menggabungkan beberapa fungsi limit atau range. Misalnya, Anda bisa menggabungkan metode queryStartingAtValue dan queryEndingAtValue untuk membatasi hasil ke rentang nilai tertentu.

Batasi jumlah hasil

Anda dapat menggunakan metode queryLimitedToFirst dan queryLimitedToLast untuk menetapkan jumlah maksimum turunan yang akan disinkronkan untuk callback tertentu. Misalnya, jika Anda menggunakan queryLimitedToFirst untuk menetapkan batas 100, awalnya Anda hanya menerima hingga 100 callback FIRDataEventTypeChildAdded . Jika Anda memiliki kurang dari 100 item yang disimpan di database Firebase, callback FIRDataEventTypeChildAdded akan diaktifkan untuk setiap item.

Saat item berubah, Anda menerima callback FIRDataEventTypeChildAdded untuk item yang memasukkan kueri dan callback FIRDataEventTypeChildRemoved untuk item yang dikeluarkan sehingga jumlah totalnya tetap 100.

Contoh berikut menunjukkan bagaimana aplikasi blog contoh dapat mengambil daftar 100 postingan terbaru oleh semua pengguna:

Cepat

Catatan: Produk Firebase ini tidak tersedia di target Cuplikan Aplikasi.
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
let recentPostsQuery = (ref?.child("posts").queryLimited(toFirst: 100))!

Objective-C

Catatan: Produk Firebase ini tidak tersedia di target Cuplikan Aplikasi.
// Last 100 posts, these are automatically the 100 most recent
// due to sorting by push() keys
FIRDatabaseQuery *recentPostsQuery = [[self.ref child:@"posts"] queryLimitedToFirst:100];

Filter berdasarkan kunci atau nilai

Anda dapat menggunakan queryStartingAtValue , queryStartingAfterValue , queryEndingAtValue , queryEndingBeforeValue , dan queryEqualToValue untuk memilih titik awal, akhir, dan ekuivalensi arbitrer untuk kueri. Ini dapat berguna untuk membuat nomor halaman data atau menemukan item dengan turunan yang memiliki nilai tertentu.

Bagaimana data kueri diurutkan

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

queryOrderedByKey

Saat menggunakan queryOrderedByKey untuk mengurutkan data Anda, data dikembalikan dalam urutan naik menurut kunci.

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

queryOrderedByValue

Saat menggunakan queryOrderedByValue , turunan diurutkan berdasarkan nilainya. Kriteria pengurutannya sama seperti di queryOrderedByChild , kecuali nilai node digunakan sebagai ganti nilai kunci anak yang ditentukan.

queryOrderedByChild

Saat menggunakan queryOrderedByChild , data yang berisi kunci anak tertentu diurutkan sebagai berikut:

  1. Anak-anak dengan nilai nil untuk kunci anak yang ditentukan didahulukan.
  2. Anak-anak dengan nilai false untuk kunci anak yang ditentukan muncul berikutnya. Jika beberapa anak memiliki nilai false , mereka diurutkan secara leksikografis berdasarkan kunci.
  3. Anak-anak dengan nilai true untuk kunci anak yang ditentukan muncul 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 akan diurutkan berdasarkan kunci.
  5. String muncul setelah angka dan diurutkan secara leksikografis dalam urutan menaik. Jika beberapa turunan memiliki nilai yang sama untuk simpul turunan tertentu, mereka diurutkan secara leksikografis berdasarkan kunci.
  6. Objek datang terakhir dan diurutkan secara leksikografis dengan kunci dalam urutan menaik.

Pisahkan pendengar

Pengamat tidak secara otomatis menghentikan sinkronisasi data saat Anda meninggalkan ViewController . Jika pengamat tidak dihapus dengan benar, pengamat akan terus menyinkronkan data ke memori lokal dan akan menyimpan objek apa pun yang ditangkap dalam penutupan event handler, yang dapat menyebabkan kebocoran memori. Saat pengamat tidak lagi diperlukan, hapus dengan meneruskan FIRDatabaseHandle terkait ke metode removeObserverWithHandle .

Saat Anda menambahkan blok panggilan balik ke referensi, FIRDatabaseHandle dikembalikan. Pegangan ini dapat digunakan untuk menghapus blok panggilan balik.

Jika banyak pendengar telah ditambahkan ke referensi basis data, setiap pendengar dipanggil saat suatu peristiwa dimunculkan. Untuk menghentikan sinkronisasi data di lokasi tersebut, Anda harus menghapus semua pengamat di suatu lokasi dengan memanggil metode removeAllObservers .

Memanggil removeObserverWithHandle atau removeAllObservers pada pendengar tidak secara otomatis menghapus pendengar yang terdaftar pada node anaknya; Anda juga harus melacak referensi atau pegangan tersebut untuk menghapusnya.

Langkah selanjutnya