Pengembangan Relational Database di Core Data
Membuat aplikasi iOS dengan penyimpanan lokal berelasi menggunakan framework Core Data milik Apple
Bermain dengan penyimpanan data, seringkali kita tidak bisa melupakan data yang berelasi. Sebuah data akan dikoneksikan dengan data yang lain sehingga nampak garis pada Core Data seperti yang ditunjukkan pada gambar di atas. Dalam sebuah entity akan terdapat attribute dan relationship.
Mungkin kamu telah mengenal relational database melalui bahasa SQL. Di sana kamu akan mengenal PRIMARY KEY dan FOREIGN KEY. Setiap tabel memiliki PRIMARY KEY sebagai tanda pengenal, namun ada beberapa tabel yang memiliki FOREIGN KEY yang merupakan sebuah PRIMARY KEY dari tabel lainnya untuk mengkoneksikan tabel yang satu dan yang lainnya.
Namun, pada Core Data, kamu tidak akan mengenal 2 hal tersebut. Xcode memiliki caranya sendiri untuk membuat relasi antar entity. Untuk membantu membayangkan, mari kita membuat beberapa entity terlebih dahulu.
Sebelum itu, saya anggap kamu telah memahami basic Core Data. Jika belum, silahkan pelajari di sini.
Pembuatan Relational Core Data
Pada contoh ini, saya akan menggunakan kategori makanan. Dalam setiap kategori akan terdapat beberapa makanan.
Note:
Name: String
Title: String
Price: Integer 64
Ketika kamu masuk tampilan editor .xcdatamodeld
, tampak 3 buah list, yaitu attribute, relationship, dan fetched properties.
- Attribute berisikan semua attribute atau variabel, sekaligus tipe datanya.
- Relationship berisikan semua relasi yang terhubung pada entity tersebut, khususnya hubungan yang keluar tabel.
- Fetched properties berisikan semua aturan atau predicate yang digunakan untuk mengambil data dalam tabel.
Kita mulai pengaturan relationship pada entity Category
. Kita akan menyambungkan entity Item
pada Category
. Beri nama relationship tersebut sebagai items
dan atur destinationnya sehingga tampak pada gambar di bawah.
Di sebelah kanan, tampak banyak pengaturan yang bisa diatur sesuai kegunaanya. Karena konsep category akan memiliki banyak item, maka atur type
menjadi To Many. Hal ini akan berdampak pada pemanggilan pada fetch. Jika masih menggunakan To One, sistem hanya akan mengembalikan satu data, namun dalam sebuah array (count: 1). Ini adalah kesalahan yang seringkali ditemui ketika kamu lupa mengatur typenya. Sedangkan, jika menggunakan To Many, sistem akan mengembalikan sesuai dengan jumlah data yang diperlukan.
Apabila kita kembali ke tampilan graph core data, kamu akan melihat gambar di bawah ini:
Garis keluar dari items, berarti adanya hubungan relationship. Garis 2 >>
berarti relationshipnya to many, sedangkan garis 1 >
berarti garisnya to one.
Selanjutnya kita atur relationship dari item ke category. Buat relationship pada Item dengan nama parentCategory
dan typenya To One
. Berbeda dengan pengaturan pada items, pada parentCategory kita akan mengatur inverse-nya.
Inverse menunjukkan bahwa relationship antara 2 entity saling berhubungan. Pada parentCategory, kita atur inverse-nya menjadi items
. Secara otomatis, pada entity category, inverse items akan langsung berubah menjadi parentCategory. Apabila kita kembali ke tampilan graph core data, kamu akan melihat gambar di bawah ini:
Initializer
Sebelum memulai, kita siapkan beberapa method dan variabel untuk digunakan di kodingan.
Create
Mari kita buat data dummy terlebih dahulu :
Category name: Sup
Sup ayam seharga 5000
Sup daging seharga 8000
Sup sayur seharga 3000
Cara memasukkan data ke dalam core data terbilang simpel dan cara memasang relationship dengan data yang lain juga cukup mudah. Apabila kamu sudah menguasai CRUD (Create, Read, Update, Delete), memasukkan data ke dalam sebuah data model hanya perlu menginisialisasikan, pasang datanya, lalu save datanya. Setelah itu, pemasangan relation antar 2 data hanya perlu satu buah baris saja.
Mari kita buat category nya terlebih dahulu.
let category = Category(context: context)
category.name = “Sup”
saveData()
Setelah itu kita buat item nya. Seperti yang telah dijelaskan sebelumnya, kita perlu memasukkan relation nya. Pemasangan kodingan tersebut harus ditulis sebelum sistem melakukan saveData()
.
let newItem = Item(context: context)
newItem.title = “Sup ayam”
newItem.price = 5000
newItem.parentCategory = category
saveData()
Pada baris ke-4, diperlihatkan cara memasang relationship dengan data category. parentCategory
merupakan relationship yang dibuat pada xcdatamodeld, sedangkan category
merupakan variable yang dibuat berdasarkan create data category di atas.
Sehingga untuk memasukkan semua data, kita ulangi contoh yang kedua berulang kali hingga tertulis kode seperti di bawah ini:
Read
Ketika membaca data dengan relationship, kita perlu menggunakan NSPredicate
. Setelah sistem melakukan fetchRequest, kita masukkan predicate untuk memanggil data. Berbeda dengan sistem MySQL yang memerlukan id sebagai key pencarian data, core data tidak memiliki key pada tabel child atau pada contoh di sini pada tabel item tidak memiliki key yang terhubung dengan tabel category.
Jadi, untuk memanggil semua data item yang memiliki nama kategori yang sama adalah dengan menulis relationship pada NSPredicate:
let predicate = NSPredicate(format: “parentCategory.name MATCHES %@”, <categoryName>)
parentCategory
di atas merupakan relationship yang terhubung pada entity category.
Tampilan lengkap untuk read adalah sebagai berikut:
Update dan Delete
Khusus update dan delete, perubahan yang ingin dilakukan pada core data sama saja dengan biasanya. Kamu cukup memanggil item yang ingin diubah atau dibuang, lalu mengeksekusi prosesnya. Ketika kamu ingin membuang data pada parentnya, atau pada contoh ini, kamu ingin membuang sebuah category, jangan lupa untuk mengubah data pada tabel item atau membuangnya juga.
Pelajari Basic CRUD Core Data di sini:
Belajar Menggunakan Core Data di Swift 5
Kesimpulan
Penggunaan relational core data dalam Swift tidak sesulit yang dibayangkan. Apabila kamu sudah menguasai core data secara basic, kamu pasti mempelajari ini dengan lebih mudah. Ilmu yang sedikit, namun berguna untuk masa depan. Semoga ilmu ini bisa menjadi ilmu yang bagus untuk project yang kalian kembangkan di ke depannya.
Semoga berhasil dan selamat mencoba…