Database Realm Mobile untuk iOS
() translation by (you can also view the original English article)



Pengantar
Di panduan ini, saya akan menunjukkanmu cara menggunakan sebuah solusi database on-device yang bertenaga dan eleng untuk aplikasi iOS-mu: Database Realm Mobile. Sebuah alternatif dari Apple Core Data atau SQLite dengan object-relational-mappin (ORM), Database Realm Mobile menawakan pengembang sebuah cara yang lebih mudah dan natural untuk menyimpan dan query data.
Apa Itu Database Realm Mobile?
Dianggap sebagai object database sejati, Realm membedakan dirinya sendiri dari pustaka semisalnya dengan memperlakukan data objects sebagai live objects - yang berarti objek diperbaharui secara otomatis. Mereka bereaksi secara responsif untuk berubah dan mudah bertahan. Bahkan lebih baik lagi, kamu tidak perlu belajar susah payah seperti yang terjadi dengan Core Data atau scripting SQLite. Justru, kamu dapat bekerja dalam cara yang benar-benar object-oriented. Database Realm Mobile juga merupakan open source sejak tahun 2016 dan tersedia secara gratis bagi para pengembang.
Selain Realm Mobile Database, perusahaannya juga menawarkan Realm Mobile Platform, Andalannya adalah PAAS sebagai pelengkap database Realm Mobile dengan solusi server-side.
Realm Mobile Platform, memperluas intinya dengan sinkronisasi data real time dan penanganan event di sisi server, dan semua-nya terhubung secara mulus ke aplikasinya. Pengembang menggunakan platform-nya untuk membangun aplikasi dengan fungsionalitas yang kuat seperti berpesan, kolaborasi, dan kemampuan offline-first. Platform-nya juga ideal untuk memobilisasi API-API yang telah ada, membuatnya mudah untuk membuat aplikasi yang responsif dan menarik yang terhubung ke warisan sistem dan layanan. (realm.io)
Jadi Platform Realm Mobile berkerja di sis server dengan cara yang sama mulusnya dengan database Realm Mobile. Menyediakan sinkronisasi data otomatis dan penanganan event di antara server dan klien. Dan dalam proses perangkuman kompleksitas yang muncul ketika berhubungan dengan sinkronisasi data. Platform Realm Mobile melampaui cakupan dari panduan ini, tapi saya akan kembali pada nya dalam kiriman yang akan datang.
Kenapa Database Realm Mobile?
Selain menyemalatkan pengembang dari pusingnya belajar Core Data, Database Realm Mobile juga menyediakan aneka keuntungan.
Performa & Thread-Safety
Performanya ramah, Database Realm Mobile telah terbukti menjalankan kueri dan sinkronisasi objek lebih cepat daripada Core Data dan mengakses data-nya secara bersamaan bukanlah sebuah masalah. Banyak sumber bisa mengakses objek yang sama tanpa perlu mengatur atau khawatir mengenai inkonsistensi data.
Enkripsi
database Realm Mobile menyediakan layanan enkripsi-nya sendiri untuk melindungi database di disk menggunakan AES-256+SHA2 melalui enkripsi 64-byte.
Sehingga semua data yang disimpan di disk dienkripsi dan dekripsi secara transpara dengan AES-256 seperlunya, dan diverifikasi dengan SHA-2 HMAC. Key enkripsi yang sama harus disediakan setiap kali kamu mendapatkan sebuah Realm instance.
Lintas Platform
Tidak seperti Core Data, Database Realm Mobile benar-benar lintas platform yang mendukung iOS, Android, aplikasi web JavaScript dan Xamarin.
Reaktif secara Alami
Karena cara kerja dari live object kamu bisa menghubungkan element antarmuka-mu dengan model data akan antarmuka-mu akan diperbaharui secara reaktif seiring data-nya berubah! Tidak ada kode sinkronisasi yang rumit atau logika penghubungan dibutuhkan seperti yang ada pada Core Data.
Ketika dipasangkan degan Realm Mobile Platform dan Realm Object Server, pengembang akan mendapatkan keuntungan tambahan dari sinkronisasi data ke awan hanya dengan mengatur URL objek Realm.
Bahkan dengan Platform Realm Mobile, kamu tidak perlu khawatir mengenai koneksi-koneksi yang terinterupsi karena Realm memiliki kemampuan offline bawaan dan akan mengantri sebuah perubahan data untuk dikirim ke server-nya.
Klien
Realm memiliki banyak klien yang telah mengadopsi Database Realm Mobile secara terbuka termasuk Netflix dan Starbucks.
Alternatif dari Database Realm Mobile
Tentu saja, Database Realm Mobile bukanlah satu-satunya solusi penyimpanan data. Saya telah menyebutkan Core Data milik Apple. Dan walaupun dia jauh lebih rumit untuk dipelajari, faktanya bahwa dia adalah milik Apple memiliki arti bahwa banyak pengembang iOS menggunakannya dan akan terus memiliki komunitas pengembang dan meterial pendukung yang banyak.
Sebuah solusi yang cukup mirip dengan Database Realm Mobile adalah Firebase milik Google-walaupun dia adalah solusi yang tergabung antara sisi klien dan server. Firevase sama-sama mudah dan gratis untuk digunakan. Namun memiliki biaya tambahan tergantung penggunaannya. Satu kelemahan dari Firebase adalah kamu dipasangkan secara ketat ke platformnya sementara dengan Realm kamu bebas untuk memilih back-end milikmu sendiri-atau bahkan tanpa back-end sama sekali!
Aplikasi Realm Pertamamu
Diasumsi sudah tahu
Panduan ini mengasumsi kamu memiliki pengalaman kerja dengan Swift namun tanpa memerlukan pengetahuan mengenai Core Data maupun database.
Seperti Realm, kita akan menggunakan bagian berikut dari iOS:
- UIKit: untuk mendemonstrasikan data kita secara visual
- CocoaPods: Pustaka dependency pihak ketiga yang akan digunakan untuk memasang Database Realm Mobile
Tujuan dari Panduan Ini
Di akhir panduan ini, kamu akan mengembangkan sebuah aplikasi to-do sederhana yang ditulis dalam Swify yang menggunakan Database Realm Mobile untuk menahan data-nya secara lokal. Dan seiring pembuatan aplikasi kamu akan mempelajari konsep-konsep berikut:
- mengatur pustaka Realm pada sebuah proyek baru melalui CocoaPods
- mengatur App Delegate-nya untuk mengimpor pustaka Realm
- membuat model object dari 'live-object'
- membuat View Controllers dan Storyboard di dalam antarmuka aplikasi
- Menghubungkan model data ke view controllers dan views
kamu bisa mengunduh sumber kode langkap-nya dari panduan GitHub repo.
Mengatur Proyeknya
Oke, mari mulai buat aplikasi Realm kita: RealmDo. Kita akan membuat sebuah proyek Xcode baru, jadi pergi ke sana dan buat sebuah Master-Detail application.



Selanjutnya, jika kamu belum memasang CocoaPods, kamu harus melakukannya sekarang. Pergi ke terminal dan ketik baris berikut:
$ sudo gem install cocoapods
Setelahnya kamu akan mendapatkan konfirmasi bahwa cocoapods telah terpasang. Sementara masih di terminal, pergi ke proyek Xcode yang baru kamu buat dan ketik baris berikut untuk menginisialisasi Podfile baru:
$ pod init
Kamu akan melihat sebuah berkas baru bernama Podfile terleteak di akar direktori proyekmu. Berkas ini pada dasarnya akan mengatur pustaka yang akan kita gunakan dalam proyek kita. Kamu bisa mengacu ke dokumentasi CocoaPods resmi untuk informasi lebih lanjut mengenai cara kerja Podfiles.
Selanjutnya, kita harus menambahkan pustaka cocoapod untuk Realm. Buka podfile di editor teksdan tambahkan baris berikut di bawah #Pods for RealmDo
:
1 |
... |
2 |
use dynamic frameworks |
3 |
use_frameworks! |
4 |
|
5 |
# Pods for RealmDo |
6 |
pod 'RealmSwift' |
7 |
|
8 |
target 'RealmDoTests' do |
9 |
... |
Simpan berkasnya, keluar dan ketik:pod install
Setelah CocoaPods selesai memasang pustakanya, dia akan menanyakan kita untuk menutup proyek Xcode dan membuka workspace-nya. Untuk melakukannya, dan kita siap untuk memprosesnya, kita akan mulai dengan AppDelegate
.
siapkan App Delegate untuk mengimpor pustaka Realm.
Dalam AppDelegate
kita, kita akan mengimpor pustaka Realm sehingga tambahkan baris berikut ke berkas AppDelegate.swift:
1 |
import UIKit |
2 |
import RealmSwift |
3 |
|
4 |
@UIApplicationMain |
5 |
class AppDelegate:. .. |
Tinggalkan class-nya untuk sekarang, sehingga kita bisa fokus pada model object.
Live Object Models
Mendefinisikan model di Realm sangatlah sederhana; kamu harus perlu membuat logical model class. Dalam proyek ita, kita akan menyimpan pengingat, jadi mari buat class bernama Reminder.swift dengan kode berikut:
1 |
import RealmSwift |
2 |
class Reminder: Object { |
3 |
dynamic var name = "" |
4 |
dynamic var done = false |
5 |
} |
Untuk panduan ini kita hanya membutuhkan model Reminder
ini, jadi kita telah selesai! Sesederhana itu, dan mencontoh sebuah model juga sama mudahnya seperti yang akan kita cari tahu nanti.
Menyiapkan View Controllers dan Storyboard
Sekarang kita akan fokus pada view controllers, akan tetapi sebelum kita ke class MasterViewController.swift, mari buka Main.storyboard dan tambahkan sebuah tombol batang di pojok kanan bernama Add, seperti berikut:



Proyeknya diinsialisasi oleh Xcode dengan datasorce-nya dan delegate menghubungkannya ke view controller. Sehingga yang perlu kita lakukan sekarang adalah menambahkan tombol yang baru saja kita buat ke view controller sebagai sebuah IBOutlet
. Tahan dan geser dari tombolnya ke view controller dalam split-view mode untuk menghasilkan tautannya.



Menginisialisasi Realm
Sekarang, lanjut ke berkas MasterViewController.swift, kita menyatakan variabel yang akan dibutuhkan yang harusnya tampbah seperti berikut:
1 |
class MasterViewController: UITableViewController { |
2 |
|
3 |
var realm : Realm! //(1) |
4 |
@IBOutlet weak var addButton: UIBarButtonItem! |
5 |
|
6 |
var remindersList: Results<Reminder> { //(2) |
7 |
get { |
8 |
return realm.objects(Reminder.self) |
9 |
} |
10 |
} |
11 |
override func viewDidLoad() { //(3) |
12 |
super.viewDidLoad() |
13 |
// Do any additional setup after loading the view, typically from a nib. |
14 |
realm = try! Realm() |
15 |
} |
16 |
… |
Pertama, di baris (1), kita menyatakan variabel Realm yang akan referensikan untuk mendapatkan datastore kita. Lalu, lazy-load remiderlist
yang memang objek Realm untuk sebuah daftar dari seluruh objek Reminder. Terakhir, kita menirukan variabel Realm yang dideklarasi di awal. Tak ada yang terlalu rumit sejauh ini!
Menyiapkan View Delegate dan Datasource
Selanjutnya, kita siapkan metode tableView
delegate dan datasource sebagai berikut:
1 |
override func numberOfSections(in tableView: UITableView) -> Int { |
2 |
return 1 |
3 |
} |
4 |
|
5 |
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // (4) |
6 |
return remindersList.count |
7 |
} |
8 |
|
9 |
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { |
10 |
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) |
11 |
|
12 |
let item = remindersList[indexPath.row] |
13 |
|
14 |
cell.textLabel!.text = item.name // (5) |
15 |
cell.textLabel!.textColor = item.done == false ? UIColor.black : UIColor.lightGray |
16 |
|
17 |
return cell |
18 |
} |
Pada baris (4), kita dapat jumlah dari jumlah objek daftar reminderList
yang akan mengatur jumlah dari baris pada tableView
satu bagian kita.
Lalu, pada tiap sel, kita mendapatkan properti live object Reminder
untuk mengatur tabelnya sambil menandari apakah item-nya ditandai sebagai selesai atau belum.
Menulis Perubahan ke Database-nya
Kita ingin pengguna kita bisa mengubah item telah selesai (atau belum), yang kita indikasikan dengan perubahan warna dari label. Kita juga ingin untuk membuat tabel-nya dapat diedit (pengguna akan bisa menghapus sel dengan sapuan dari kanan ke kiri) yang akan kita selesaikan dengan kode berikut:
1 |
override func tableView(_ tableView: UITableView, |
2 |
didSelectRowAt indexPath: IndexPath) { |
3 |
|
4 |
let item = remindersList[indexPath.row] |
5 |
try! self.realm.write({ // (6) |
6 |
item.done = !item.done |
7 |
}) |
8 |
|
9 |
//refresh rows |
10 |
tableView.reloadRows(at: [indexPath], with: .automatic) |
11 |
|
12 |
} |
13 |
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool { |
14 |
return true |
15 |
} |
16 |
|
17 |
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { |
18 |
|
19 |
if (editingStyle == .delete){ |
20 |
let item = remindersList[indexPath.row] |
21 |
try! self.realm.write({ |
22 |
self.realm.delete(item) // (7) |
23 |
}) |
24 |
|
25 |
tableView.deleteRows(at:[indexPath], with: .automatic) |
26 |
|
27 |
} |
28 |
|
29 |
} |
Pada baris (6), di sini adalah pertama kalinya kita akan menulis database kita kembali yang dilakukan dengan mudah menggunakan sebuah baris self.realm.write
. Ingat bahwa yang perlu kamu lakukan dengan instance object adalah mengatur nilainya dan tidak lebih. Jadi pada kasus ini tandai nilai benar dengan item.done = !item.done
.
Baris (7) adalah contoh kedua dari menulis kembali ke database kita: kita menghapus sebuah objek dari database-nya dengan menghapus instance object-nya.
Menambahkan Objek Baru
Kita membuat kemajuan yang bagus, dan faktanya kita hampir selesai! Kita sekarang bisa memuat, dan menghapus pengingat kita namun mita kehilangan sebuah aksi yang penting: menambah sebuah pengingat baru. Untuk mengimplementasikannya, buat sebuah metode @IBAction
baru dan hubungkan toolbar Add storyboard ke metode-nya.
Kita akan membuat sebuah AlertViewController
sederhana pada contoh kita, tapi sebagai latihan terpisah, daripada itu cobalah unuk perbaiki aplikasi dengan memperbaharui ke view controller yang baru.
Untuk saat ini, tambahkanlah kode berikut:
1 |
@IBAction func addReminder(_ sender: Any) { |
2 |
|
3 |
let alertVC : UIAlertController = UIAlertController(title: "New Reminder", message: "What do you want to remember?", preferredStyle: .alert) |
4 |
|
5 |
alertVC.addTextField { (UITextField) in |
6 |
|
7 |
} |
8 |
|
9 |
let cancelAction = UIAlertAction.init(title: "Cancel", style: .destructive, handler: nil) |
10 |
|
11 |
alertVC.addAction(cancelAction) |
12 |
|
13 |
//Alert action closure |
14 |
let addAction = UIAlertAction.init(title: "Add", style: .default) { (UIAlertAction) -> Void in |
15 |
|
16 |
let textFieldReminder = (alertVC.textFields?.first)! as UITextField |
17 |
|
18 |
let reminderItem = Reminder() // (8) |
19 |
reminderItem.name = textFieldReminder.text! |
20 |
reminderItem.done = false |
21 |
|
22 |
// We are adding the reminder to our database |
23 |
try! self.realm.write({ |
24 |
self.realm.add(reminderItem) // (9) |
25 |
|
26 |
self.tableView.insertRows(at: [IndexPath.init(row: self.remindersList.count-1, section: 0)], with: .automatic) |
27 |
}) |
28 |
|
29 |
} |
30 |
|
31 |
alertVC.addAction(addAction) |
32 |
|
33 |
present(alertVC, animated: true, completion: nil) |
34 |
|
35 |
} |
Pada baris (8), kita membuat sebuah instance pengingat baru dan mengatur properti-nya. Lalu, pada baris (9) kita menambahkan pengingat-nya melalui self.realm.add(item)
.
Menguji Aplikasi-nya
Jadi mari coba aplikasinya, dengan membuat dan menjalankannya di Simulator. Pergi dan tambahkan dua pengingat dan atur yang satu menjadi telah selesai dengan mengetuknya. Jika kamu keluar dan membuka aplikasi-nya kembali, item-mu seharusnya masih ada di sana.



Realm Browser
Dan begitulah! Dengan kurva pembelajaran yang sangat kecil, dan melewati kerumitan Code Data, kita telah membuath sebuah back-end pada perangkat. Inilah Database Realm Mobile. Kamu juga bisa memverifikasi bahwa data-nya ada pada perangkat dengan mengunduh Realm Browser, sebuah aplikasi macOS yang mengizinkanmu untuk melihat, debug dan mengedit objek data Realm.
Unduh aplikasinya dari Mac App Store dan buka database Realm yang terletak di folder CoreSimulator/Devices/appID/data/... . Berkas yang kamu cari adalah db.realm.



Setelah membukanya, kamu tidak hany bisa melihat data-mu tapi kamu juga bisa mengubah dan menambahkan data baru. Pergi dan cobalah!



Kesimpulan
Di panduan ini, kamu telah belajar mengenai Database Realm Mobile dan mengapa dia jadi alat bertenaga bagi pengembang iOS. Kita juga menyentuh secara singkat mitra server-nya, Realm Mobile Platform, yang akan kita bahas pada panduan terpisah.
Lalu kita membuat sebuah aplikasi pengingat bertenaga yang diperkuat oleh Database Realm Mobile. Hanya dalam beberapa baris kode kita telah mampu untuk:
- Mengatur live-object model untuk Pengingat-nya
- Menguhubngkan view controller kita dengan data model
- Mendeklarasi, mencontoh, memuat, menambah dan menghapus dari database Realm
Terakhir, kamu melihat cara menggunakan Realm Browser untuk debug dan melihat datamu.
Ini adalah pengatar yang sangat dasar mengenai Database Realm Mobile, tapi kamu bisa menggunakannya sebagai titik awal untuk menyelami banyak topik lebih lanjut. Sebagai langkah berikutnya, kamu bisa melihat:
- Data Model Realm
- Dokumentasi Realm untuk Swift
- Dokumentasi Realm untuk Objective-C
- Referensi Realm Mobile Database API
Pastikan untuk menjelajahi beberapa tema lanjutan dari dokumentasi di atas, seperti bekerja dengan relationships, uji coba Realm objects, threading dan encryption.
Dan selagi kamu di sini, pastikan untuk mengecek beberapa kiriman lain mengenai pengembangan aplikasi iOS!