Bekerja dengan Core Data dan JSON
Bagaimana cara parsing JSON dan menyimpannya ke dalam Core Data dalam Swift?
Ketika kita membuat aplikasi, kita tidak akan pernah pergi jauh dari yang bernama data. Dalam aplikasi sendiri ada 2 tipe jenis data, yaitu aplikasi statis dan aplikasi dinamis. Aplikasi statis merupakan aplikasi dengan data yang tidak pernah berubah atau diprogram secara hard-code sehingga apabila ingin mengubah data diperlukan untuk memperbaharui aplikasi. Berbeda dengan aplikasi statis, aplikasi dinamis merupakan aplikasi dengan data yang mampu diubah dalam waktu ke waktu tanpa perlu meperbaharui aplikasi.
Berbicara dengan data dinamis, biasanya data disimpan di luar aplikasi itu sendiri atau di dalam web server. Pengambilan data bisa melalui API server dalam bentuk JSON ataupun XML. Setelah mengambil data, informasi dari server akan disimpan ke dalam penyimpanan lokal, contohnya Core Data dan SQLite. Namun karena saya akan membahas menggunakan bahasa Swift, maka kita akan menggunakan penyimpanan native milik Apple, yaitu Core Data. Setelah disimpan, data yang ditampilkan akan berdasarkan data yang diambil pada penyimpanan lokal.
JSON Parse
Pada pembahasan ini, saya akan membahas pemakaian JSON dan menyimpannya ke dalam Core Data. Saya telah menyiapkan sebuah JSON yang bisa digunakan, pada contoh ini, kita akan menggunakan contoh data restoran. Kamu bisa menggunakan data sendiri kalau mau.
Apabila kalian menyiapkan json sendiri, silahkan masukkan file json kalian ke dalam project dan jangan lupa untuk memperhatikan file extension .json
. Setelah itu, dalam swift, kita perlu menyiapkan sebuah fungsi yang mampu membaca file, mengambil isi file, dan memasukkannya ke dalam sebuah variabel untuk diproses.
Fungsi loadJSONData()
akan memanggil fungsi loadFile()
yang berfungsi sebagai alat pembaca file. Pada kodingan di atas, kita mengambil via Bundle
, lalu mencari fileURL
nya. Apabila file tidak ditemukan, maka fungsi akan mengembalikan data kosong. Namun, apabila file ditemukan, data dari fileURL akan dikembalikan. Sebagai catatan, Swift tidak melihat dimana filemu tersimpan, ia cukup pintar untuk mencarinya di semua folder project. Pada contoh di atas, saya menyimpan file json yang dimiliki dengan nama resto.json
sehingga untuk menggunakannya kamu cukup memanggil nama file pada fungsi yang tersedia (lihat line 2).
Sebelum kita melanjutkan tutorial, ada baiknya kita memahami apa itu JSON terlebih dahulu. JSON adalah JavaScript Object Notation yang merupakan subset dari JavaScript. JSON selalu dimulai dari tanda kurung kurawal {
dan tanda kurung kurawal }
yang di dalamnya terdapat kumpulan data dengan format key dan value. Ketika ingin menggunakannya, kita perlu melakukan serialisasi (encode) dan deserialisasi (decode). Encode merupakan proses mengubah data menjadi JSON, sedangkan decode merupakan sebaliknya.
Pada tutorial ini, kita perlu mengubah data dari JSON menjadi data yang bisa digunakan. Maka dari itu, kita akan menggunakan proses decode. Pada proses decode ini, kita membutuhkan kelas struct yang sudah mengimplementasikan sistem Decodable
. Swift juga telah memiliki library untuk melakukan decode JSON tanpa perlu memasukkan external library, yaitu JSONDecoder()
. Proses decode JSON terjadi sebagai berikut:
Untuk memahami kegunaan 2 struct di bawah, mari kita melihat JSON resto tadi. Pada baris kedua, terdapat sebuah key bernama “data” yang berisikan value array of object (array yang memiliki banyak key dan value). Maka dari itu, “data” ini akan ditangani oleh struct RestoData
.
Pada setiap object “data”, terdapat 4 buah key, yaitu id
, name
, desc
, dan menu
dengan tipe data yang berbeda-beda. Id
bertipe data Int, name
dan desc
bertipa data string, dan menu
bertipe data array of string karena berisikan banyak data string dan diawali oleh kurung kotak []
. 4 key dan value ini ditangani oleh struct Resto
.
Setelah melakukan proses decode, data pada newData
(line 6) sudah bisa dipakai dengan format array of object Resto
.
Save data to Core Data
Ketika data JSON sudah berhasil di decode, data siap dimasukkan ke dalam penyimpanan lokal. Apa itu Core Data? Core Data adalah sebuah obyek graf dan framework milik Apple yang biasa digunakan dalam iOS dan macOS. Penyimpanan Core Data terdiri atas entity
dan attribute
dimana entity merupakan tabel atau model penyimpanan data dan attribute merupakan variabel yang tersimpan di dalamnya. Untuk membantu membayangkan, kalau dalam struct, entity merupakan nama struct dan attribute merupakan setiap variabel di dalamnya. Untuk penjelasan lebih lanjut tentang Core Data, kalian bisa cek di sini.
Pada setiap attribute, terdapat properties di dalamnya, mulai dari nama, tipe data, optional, default value, dan lain-lain. Kalau kalian telah memahami struktur relational SQL, maka kamu akan memahami penggunaan ini dengan lebih mudah.
Dari proyek ini, kalian bisa langsung membuat entity dan attributenya. Dalam tipe data sendiri terdapat beberapa pilihan, namun yang menjadi pertanyaan, tipe data apa yang harus dipilih ketika data tersebut merupakan angka integer dan array. Pada bilangan bulat, kalian bisa menggunakan Integer 16
, Integer 32
, atau Integer 64
. Bedanya apa? Mereka memang sama-sama menyimpan data angka, namun core data di sini menekankan pada ukuran data yang akan disimpan sehingga tidak memakan banyak memory. Semakin besar angka, maka tipe data integer yang digunakan, ada baiknya ukuran integer ditingkatkan. Pada contoh ini, saya membuat entity dengan nama Restaurant
dan menggunakan Integer 16 untuk menyimpan id.
Ketika kalian melihat gambar di atas, attribute menu
menggunakan tipe data Transformable
. Apakah itu? Tipe data transformable merupakan tipe data yang bisa diatur secara custom atau menggunakan object class. Pada proyek kita, attribute menu akan menampung array of string, maka kita cukup pasang tipe data Transformable dan pada pengaturannya, kita mengatur custom class attribute menjadi [String]
(String dengan kurung kotak).
Setelah membuat dan mengatur Core Data, kita bisa langsung menggunakannya. Pada tutorial ini, kita akan memerlukan metode Create saja untuk memasukkan data yang ada ke dalam Core Data. Namun, apabila kalian ingin mengetahui tentang metode lainnya dalam Core Data, kalian bisa cek di sini.
Pada Core Data, setiap entity yang dibuat akan berlaku seperti sebuah struct sehingga proses memasukkannya mirip seperti struct biasa.
Untuk memasukkannya, kita membutuhkan 2 fungsi di atas. Pertama, fungsi saveDataToCD()
. Fungsi ini berfungsi untuk melakukan penyimpanan berdasarkan context yang ada. Context
tersebut berasal dari environment background task karena core data tidak berjalan pada proses utama. Penyimpanan di lakukan dalam error handling (try-catch) untuk menghindari kegagalan yang mampu menyebabkan aplikasi crash.
Lalu, fungsi create()
berfungsi sebagai method memasukkan data dari data lama (Resto) menjadi data pada core data (Restaurant). Class Restaurant ini berasal dari entity seperti yang sudah dijelaskan sebelumnya. Dimulai dari inisialisasi class ke dalam variable, lalu masukkan datanya, terakhir panggil method saveDataToCD()
untuk disimpan.
Voila, data telah tersimpan…
Kesimpulan
Menggunakan data dinamis dalam sebuah aplikasi selalu menjadi tantangan untuk developer. Pengambilan data secara terus menerus dari API server bukan menjadi cara yang efektif. Di sini, kita telah belajar cara parsing JSON dan menyimpannya ke dalam core data. Dengan data yang telah tersimpan, kita tidak perlu lagi melakukan pengambilan data dari server, kecuali dibutuhkan. Semoga bermanfaat…
Belajar lengkap tentang Core Data di sini.