Mendapatkan FIRDatabaseReference
Untuk membaca atau menulis data dari database, Anda memerlukan instance FIRDatabaseReference
:
Swift
var ref: DatabaseReference! ref = Database.database().reference()
Objective-C
@property (strong, nonatomic) FIRDatabaseReference *ref; self.ref = [[FIRDatabase database] reference];
Membaca dan menulis daftar
Menambahkan data ke daftar
Gunakan metode childByAutoId
untuk menambahkan data ke daftar dalam aplikasi multipengguna. Metode childByAutoId
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 ada konflik tulis. Kunci unik yang dihasilkan oleh childByAutoId
didasarkan pada stempel waktu, sehingga daftar item otomatis diurutkan secara kronologis.
Anda dapat menggunakan referensi pada data baru yang ditampilkan oleh metode childByAutoId
untuk mendapatkan nilai kunci turunan yang dihasilkan otomatis atau menetapkan data untuk turunan.
Memanggil getKey
pada referensi childByAutoId
akan menampilkan kunci yang dihasilkan secara otomatis.
Anda dapat menggunakan kunci yang dihasilkan secara otomatis ini untuk mempermudah perataan struktur data. Untuk mengetahui informasi lebih lanjut, lihat contoh fan-out data.
Memproses 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 childByAutoId
atau turunan yang diupdate melalui metode updateChildValues
.
Jenis peristiwa | Penggunaan standar |
---|---|
FIRDataEventTypeChildAdded |
Mengambil daftar item atau memproses penambahan ke daftar item. Peristiwa ini dipicu satu kali untuk setiap turunan yang ada, dan dipicu lagi setiap kali ada turunan baru yang ditambahkan ke jalur yang ditentukan. Snapshot yang berisi data turunan baru akan diteruskan ke pemroses. |
FIRDataEventTypeChildChanged |
Memproses perubahan pada item dalam daftar. Peristiwa ini dipicu setiap kali node turunan diubah. Ini juga termasuk perubahan pada turunan dari node turunan. Snapshot yang diteruskan ke pemroses peristiwa berisi data turunan yang telah diperbarui. |
FIRDataEventTypeChildRemoved |
Memproses item yang dihapus dari daftar. Peristiwa ini dipicu ketika suatu turunan langsung dihapus. Snapshot yang diteruskan ke blok callback berisi data turunan yang dihapus. |
FIRDataEventTypeChildMoved |
Memproses perubahan urutan item dalam daftar yang diurutkan.
Peristiwa ini dipicu setiap kali suatu perubahan menyebabkan pengurutan ulang turunan. Peristiwa ini digunakan dengan data yang diurutkan berdasarkan queryOrderedByChild
atau queryOrderedByValue .
|
Secara bersama-sama, setiap metode ini dapat berguna untuk memproses perubahan terhadap node tertentu dalam database. Misalnya, aplikasi blogging sosial mungkin menggunakan metode ini secara bersama-sama untuk memantau aktivitas dalam komentar suatu postingan, seperti terlihat di bawah ini:
Swift
// 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
// 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]; }];
Memproses peristiwa nilai
Meskipun memproses peristiwa turunan adalah cara yang disarankan untuk membaca daftar data, memproses peristiwa nilai di referensi daftar dapat pula bermanfaat.
Menyertakan observer FIRDataEventTypeValue
ke daftar data akan menampilkan keseluruhan daftar data sebagai DataSnapshot tunggal, yang nantinya dapat di-loop untuk mengakses setiap turunan.
Meskipun hanya ada satu kueri yang cocok, snapshot tetaplah sebuah daftar yang berisi satu item. Untuk mengakses item tersebut, Anda harus melakukan loop atas hasil:
Swift
_commentsRef.observe(.value) { snapshot in for child in snapshot.children { ... } }
Objective-C
[_commentsRef observeEventType:FIRDataEventTypeValue withBlock:^(FIRDataSnapshot *snapshot) { // Loop over children NSEnumerator *children = [snapshot children]; FIRDataSnapshot *child; while (child = [children nextObject]) { // ... } }];
Pola ini dapat bermanfaat ketika Anda ingin mengambil semua turunan daftar dalam operasi tunggal, bukannya memproses peristiwa penambahan turunan lain.
Mengurutkan dan memfilter data
Anda dapat menggunakan class Realtime Database FIRDatabaseQuery
untuk mengambil data yang diurutkan berdasarkan kunci, nilai, atau nilai turunan. Anda juga dapat memfilter hasil pengurutan berdasarkan jumlah hasil tertentu atau berdasarkan rentang kunci atau nilai.
Mengurutkan data
Untuk mengambil data yang diurutkan, mulai dengan menentukan salah satu metode 'urutkan menurut' guna menentukan cara pengurutan hasil:
Metode | Penggunaan |
---|---|
queryOrderedByKey
| Mengurutkan hasil menurut kunci turunan. |
queryOrderedByValue |
Mengurutkan hasil menurut nilai turunan. |
queryOrderedByChild |
Mengurutkan hasil menurut nilai kunci turunan atau jalur turunan bertingkat yang ditentukan. |
Anda hanya bisa menggunakan satu metode 'urutkan menurut' pada satu waktu. Memanggil metode 'urutkan menurut' beberapa kali dalam kueri yang sama akan menampilkan error.
Contoh berikut menunjukkan cara mengambil daftar postingan teratas milik pengguna yang diurutkan menurut jumlah bintangnya:
Swift
// My top posts by number of stars let myTopPostsQuery = ref.child("user-posts").child(getUid()).queryOrdered(byChild: "starCount")
Objective-C
// My top posts by number of stars FIRDatabaseQuery *myTopPostsQuery = [[[self.ref child:@"user-posts"] child:[super getUid]] queryOrderedByChild:@"starCount"];
Kueri ini memperoleh postingan pengguna dari jalur 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 queryOrderedByChild
menentukan kunci turunan sebagai dasar pengurutan hasil. Dalam contoh ini, postingan diurutkan berdasarkan nilai turunan "starCount"
di setiap postingan. Kueri juga dapat diurutkan menurut 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 jalur relatif ke turunan bertingkat pada panggilan queryOrderedByChild
.
Swift
let postsByMostPopular = ref.child("posts").queryOrdered(byChild: "metrics/views")
Objective-C
FIRDatabaseQuery *postsByMostPopular = [[ref child:@"posts"] queryOrderedByChild:@"metrics/views"];
Untuk mengetahui 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 menurut' ketika menyusun kueri.
Metode | Penggunaan |
---|---|
queryLimitedToFirst |
Menetapkan jumlah item maksimum untuk ditampilkan dari awal daftar hasil yang diurutkan. |
queryLimitedToLast |
Menetapkan jumlah item maksimum untuk ditampilkan dari akhir daftar hasil yang diurutkan. |
queryStartingAtValue |
Menampilkan item yang lebih besar dari atau sama dengan kunci atau nilai yang ditentukan, tergantung metode 'urutkan menurut' yang dipilih. |
queryStartingAfterValue |
Menampilkan item yang lebih besar dari kunci atau nilai yang ditentukan, tergantung metode 'urutkan menurut' yang dipilih. |
queryEndingAtValue |
Menampilkan item yang lebih kecil dari atau sama dengan kunci atau nilai yang ditentukan, tergantung metode 'urutkan menurut' yang dipilih. |
queryEndingBeforeValue |
Menampilkan item yang kurang dari kunci atau nilai yang ditentukan, tergantung metode 'urutkan menurut' yang dipilih. |
queryEqualToValue |
Menampilkan item yang sama dengan kunci atau nilai yang ditentukan, tergantung metode 'urutkan menurut' yang dipilih. |
Berbeda dengan metode 'urutkan menurut', Anda dapat menggabungkan beberapa fungsi batas atau rentang.
Misalnya, Anda dapat menggabungkan metode queryStartingAtValue
dan queryEndingAtValue
untuk membatasi hasil pada rentang nilai tertentu.
Membatasi jumlah hasil
Anda dapat menggunakan metode queryLimitedToFirst
dan queryLimitedToLast
untuk menetapkan jumlah turunan maksimum yang akan disinkronkan untuk callback tertentu. Misalnya, jika Anda menggunakan queryLimitedToFirst
untuk menetapkan batas 100, pada awalnya Anda hanya akan menerima hingga 100 callback FIRDataEventTypeChildAdded
. Jika Anda memiliki kurang dari 100 item yang disimpan dalam database Firebase, callback FIRDataEventTypeChildAdded
akan diaktifkan untuk setiap item.
Saat item berubah, Anda akan menerima callback FIRDataEventTypeChildAdded
untuk item yang masuk ke kueri dan callback FIRDataEventTypeChildRemoved
untuk item yang keluar dari kueri, sehingga jumlah totalnya tetap 100.
Kasus berikut menunjukkan bagaimana contoh aplikasi blogging dapat mengambil daftar 100 postingan terbaru oleh semua pengguna:
Swift
// 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
// 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 ekuivalen yang arbitrer untuk kueri. Hal ini dapat bermanfaat untuk penomoran halaman data atau menemukan item dengan turunan yang memiliki nilai tertentu.
Cara data kueri diurutkan
Bagian ini menjelaskan cara pengurutan data berdasarkan setiap metode 'urutkan menurut' di class FIRDatabaseQuery
.
queryOrderedByKey
Data yang diurutkan menggunakan queryOrderedByKey
akan ditampilkan dalam urutan menaik menurut kunci.
- Turunan dengan kunci yang bisa diurai sebagai bilangan bulat 32-bit akan muncul terlebih dahulu, dan diurutkan menaik.
- Turunan dengan nilai string sebagai kuncinya akan muncul berikutnya, dan diurutkan secara leksikografis menaik.
queryOrderedByValue
Jika menggunakan queryOrderedByValue
, turunan akan diurutkan menurut nilainya. Kriteria urutan sama seperti di queryOrderedByChild
, tetapi yang digunakan adalah nilai node, bukan nilai kunci turunan yang ditentukan.
queryOrderedByChild
Jika Anda menggunakan queryOrderedByChild
, data yang berisi kunci turunan yang ditentukan akan diurutkan sebagai berikut:
- Turunan yang memiliki nilai
nil
untuk kunci turunan yang ditentukan akan muncul terlebih dahulu. - Turunan yang memiliki nilai
false
untuk kunci turunan yang ditentukan akan muncul berikutnya. Jika beberapa turunan memiliki nilaifalse
, turunan tersebut akan diurutkan secara leksikografis menurut kunci. - Turunan yang memiliki nilai
true
untuk kunci turunan yang ditentukan akan muncul berikutnya. Jika beberapa turunan memiliki nilaitrue
, turunan tersebut akan diurutkan secara leksikografis menurut kunci. - Turunan dengan nilai numerik akan muncul berikutnya, dan diurutkan menaik. Jika beberapa turunan memiliki nilai numerik yang sama untuk node turunan yang ditentukan, turunan tersebut akan diurutkan menurut kunci.
- String muncul setelah angka, dan diurutkan secara leksikografis menaik. Jika beberapa turunan memiliki nilai yang sama untuk node turunan yang ditentukan, turunan tersebut akan diurutkan secara leksikografis menurut kunci.
- Objek akan muncul terakhir, dan diurutkan secara leksikografis menaik menurut kunci.
Melepas pemroses
Observer tidak akan otomatis menghentikan sinkronisasi data saat Anda meninggalkan ViewController
. Jika tidak dihapus dengan benar, observer akan terus menyinkronkan data ke memori lokal dan akan mempertahankan objek yang diambil dalam penutupan pengendali peristiwa, yang dapat menyebabkan kebocoran memori. Jika tidak lagi diperlukan, hapus observer dengan meneruskan FIRDatabaseHandle
terkait ke metode removeObserverWithHandle
.
Saat pemblokiran callback ditambahkan ke referensi, FIRDatabaseHandle
akan ditampilkan.
Handle ini dapat digunakan untuk menghapus pemblokiran callback.
Jika beberapa pemroses ditambahkan ke referensi database, setiap pemroses akan dipanggil ketika terjadi peristiwa. Untuk menghentikan sinkronisasi data di lokasi tersebut, Anda harus menghapus semua observer di sebuah lokasi dengan memanggil metode removeAllObservers
.
Memanggil removeObserverWithHandle
atau removeAllObservers
pada pemroses tidak akan otomatis menghapus pemroses yang terdaftar pada node turunannya. Anda juga harus melacak referensi atau tuas tersebut untuk menghapusnya.