Core Data di iOS Part I – FoodPin Apps

Di postingan kali ini kita akan membahas tentang apa itu Core Data di iOS ? Bagimana menggunakan Core Data, object model, dan fetching data menggunakan core data. Selain itu kita juga akan membahas SQL Scheme dan Raw SQL Statement di iOS, so check this out ..

Core Data Design Cover Part I

Jika telah mengikuti pembahasan demi pembahasan di postingan sebelumnya berarti aplikasi kita sudah lumayan jauh berkembang. Kita telah membuat aplikasi sederhana untuk user yang ingin menyimpan daftar restaurant favorittenya. Dan di postingan sebelum ini juga kita telah berhasil membuat halaman untuk menambahkan restaurant. Sejauh ini, semua restaurant yang ada di source code disimpan didalam array. Jika kita ingin menyimpan restaurant yang baru, yaitu dengan menambahkan informasi restaurant yang baru kedalam array restaurant yang telah ada.

Nah jika kita tetap menggunakan metode ini, kita tidak bisa menyimpan data restaurant tersebut secara permanen. Karena data hanya tersimpan sementara di memory (array) yang mudah hilang. Contohnya ketika kita keluar dari aplikasi, semua perubahan yang dilakukan akan hilang. Jika ingin membuat aplikasi menjadi lebih keren lagi harusnya metodanya tidak seperti ini, kita harus tau bagaimana menyimpan data tersebut secara permanen.

Untuk menyimpan data secara permanan, kita membuatkan sebuah tempat penyimpanan yang tetap seperti sebuah file atau database. Dengan menyimpan data kedalam database, contohnya kita tidak akan kehilangan data walaupun kita telah keluar dari aplikasi atau aplikasinya crash. File merupakan solusi lainnya untuk menyimpan data tetapi solusi ini lebih cocok untuk penyimpanan data dengan skala kecil dan jarang diubah.

Untuk aplikasi FoodPin, tentu kedepannya kita akan mempunyai ribuan data restaurant dan user juga akan sering menambah/menghapus data restaurant tersebut. Dalam kasus seperti itu, database adalah solusi terbaik untuk menghandle data dalam jumlah besar. Nah di pembahasan kali ini kita akan membahas tentang Core Data framework dan mengetahui bagaimana mengatur sebuah data didalam database. Selain itu kedepannya akan banyak perubahan pada project FoodPin kita, tapi tetap tenang, karena setelah Core Data terimplementasikan semua data restaurant sudah tersimpan secara permanen dan aman.

Karena kita melanjutkan pembahasan sebelumnya, oleh karena itu pastikan project FoodPin sama dengan di pembahasan ini.


 

Apa itu Core Data ?

Ketika kita berbicara tentang data pesisten (tetap), maka Anda akan berpikir tentan database. Jika Anda familiar dengan Oracle atau MySQL, tentu akan tahu dengan relational database untuk menyimpan data pada table form, baris atau kolom. Karena aplikasi ini juga akan menggunakan query SQL (Structured Query Language). Tetapi jangan campurkan dulu pengeritan Core Data dengan database, karena SQLite database merupakan penyimpanan data bawaah untuk Core Data di iOS, jadi Core Data bukanlah sebuah relational database. Core Data merupakan framework yang memperbolehkan developer untuk berinteraksi dengan database melalui konsep object-oriented.

Mari kita jadikan aplikasi FoodPin sebagai contohnya, jika kita ingin menyimpan data kedalam database, kita tentu membuat code untuk menghubungkannya dengan database, seperti mengambil/mengupdate data menggunakan SQL. Nah ini tentu akan menyusahkan developer, khususnya developer yang belum begitu mengenal SQL.

Core Data bertanggung jawab untuk menyimpan data dengan cara yng mudah. Kita bisa petakan object yang ada di aplikasi kedalam sebua table di database.


 

Core Data Stack

Sebelum kita memulai bekerja pada project, pertama kali kita harus mengetahui dasar dari Core Data Stack (kumpulan core data), dengan melihat pada gambar berikut:

Core Data Stack
Core Data Stack

Managed Object Context – Anggap ini sebagai area temporary memory yang berisikan object yang berinteraksi dengan data yang ada di penyimpanan. Fungsinya untuk mengatur object yang telah dibuat dan mengembalikannya menggunakan framework Core Data. Diantara komponen yang ada di Core Data Stack, Managed Object Context adalah salah satu pekerjaan yang akan sering digunakan. Biasanya, apapun yang kita butuhkan mengambil atau menyimpan object di penyimpanan, Context adalah komponen pertama yang akan kita gunakan.

Persistent Store Coordinator – SQLite merupakan media penyimpanan bawaan yang ada di iOS. Dan juga Core Data memperbolehkan developer untuk menyusun banyak tempat penyimpanan dengan entity yang berbeda. Persistent Store Coordinator merupakan bagian sistem yang bertanggung jawab untuk mengatur secara terus menerus object yang berbeda dan menyimpannya di tempat penyimpanan. Kita akan lebih memahami tentang Persistent Store Coordinator ketika menggunakan Core Data.

Managed Object Model – Ini mendeskripsikan skema dari aplikasi kita. Jika aplikasi kita menggunakan database, anggap ini sebagai skema databasenya. Skema merepresentasikan sekumpulan object (entity). Contohnya, kumpulan dari object model yang bida digunkan untuk menjelaskan restaurant di aplikasi FoodPin. Di Xcode, Managed Object Model berbentuk file dengan ekstensi .xcdatamodeld. Kita bisa menggunakan visual editor untuk membuat entity dan attributnya, dan juda hubungannya.

Persistent Store – Ini merupakan repository bawaan untuk data kita yang merupakan penyimpanan sebenarnya. Biasanya dalam bentuk database dan SQLite adalah database bawaanya, tetapi bisa juga dalam bentuk file XML.


 

Menggunakan Template Core Data

Untuk menggunakan core data, langkah pertama yaitu dengan membuat project baru dan meng-enable kan pilihan Core Data. Xcode akan membuat code yang dibutuhkan di AppDelegate dan juga akan membuat file model data untuk menggunakan Core Data.

Enable Core Data
Enable Core Data

Jika kita membuat project CoraDataDemo dengan menggunakan fitur Core Data, kita akan melihat variabel dan method yang telah terbuat secara otomatis di AppDelegate:

Variabel ini membuat kita lebih mudah untuk mengakses Core Data stack seperti mengatur hubungan antar object. Pertanyaannya adalah bagaiana kita bisa menggunakan template code ini untuk project kita yang telah ada sebelumnya. Kita hanya perlu meng-copy paste code tersebut kedalam file AppDelegate.swift kita di project FoodPin. Tetapi kita perlu sedikit perubahan didalamnya, yaitu pada bagian:

let modelURL = NSBundle.mainBundle().URLForResource("CoreDataDemo", withExtension: "momd")!
let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("CoreDataDemo.sqlite")

Template code aslinya telah dibuat untuk project CoreDataDemo. Xcode menamakan SQLite dan file model datanya menggunakan nama project, nah untuk project FoodPin kita harus mengganti keduanya dengan FoodPin. Sehingga menjadi seperti berikut:

let modelURL = NSBundle.mainBundle().URLForResource("FoodPin", withExtension: "momd")!
let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent("FoodPin.sqlite")

Terakhir tambahkan statement awal AppDelegate untuk mengggunakan Core Data framework:

import CoreData

Jika Anda kesulitan untuk mengcopy paste format code diatas, Anda bisa mendownload project yang sudah diaktfikan fitur code data disini: (https://www.dropbox.com/s/dnbhi0a794zhq9s/FoodPinCoreDataTemplate.zip?dl=0)


 

Membuat Managed Object Model

Setelah kita mempersiapkan code untuk mengakses Core Data Stack, mari kita pindah untuk managed object model. Di project navigation, klik kanan folder FoodPin dan pilih “New File ..”. Pilih Core Data dan pilih Data Model.

Membuat model data menggunanan template Data Model
Membuat model data menggunanan template Data Model

Beri nama modelnya dengan FoodPin dan klik “Create” untuk membuat data model. Setelah terbuat, harusnya kita telah menemukan file FoodPin.xcdatamodeld di project navigator. Pilih file tersebut dan buka data model ediotr. Dari sini, kita bisa membuat entity untuk mengatur object model.

Seperti yang diinginkan sebelumnya yaitu untuk menyimpan object Restaurant ke dalam database, kita akan membuat entity Restaurant sesuai dengan class Restaurant di code kita. Untuk membuat entity, klik tombol “Add Entity” dibawah pane editor dan beri nama entitynya dengan Restaurant.

Untuk menyimpan data pada object Restaurant ke dalam database, kita harus menambahkan beberapa atribut untuk entity. Kita hanya perlu mengklik tombol + dibawah bagian atribut untuk membuat atribut baru. Tambahkan 5 atribut untuk entity dengan nama name, type, location, image, dan isVisited, seperti yang terlihat pada gambar dibawah ini.

Menambahkan attributes untuk entity Restaurant
Menambahkan attributes untuk entity Restaurant

Tipe Atribut nama, type, location, dan isVisited hampir sama. Tetapi kenapa kita memasang tipe attribut image dengan Binary Data?

Secara garis besar, gambar restaurant telah di bundle kedalam aplikasi, oleh karena itu kita bisa mengambil gambar dengan memanggil UIImage dengan nama filenya saja. Ketika user membuat restaurant baru, gambar diambil dari sumber luar aplikasi seperti dari photo library atau foto yang diambil dari kamera. Dalam kasus ini, kita tidak bisa hanya menyimpan nama filenya saja, kita harus menyimpan data gambar kedalam database. Dan data binary lah yang bertanggung jawab untuk ini.

Contoh hubungan antara object model dengan entity
Contoh hubungan antara object model dengan entity

 

Membuat Managed Object

Object Model yang berada didalam Core Data framework dinamakan dengan managed object (object yang telah teratur). Managed Object adalah inti dari aplikasi Core Data, karena itu merepresentasikan data dari aplikasi kita. Sekarang kita telah membuat model managed object, selanjutnya adalah untuk membuat managed objectnya. Untuk project FoodPin ikta, kita bisa mengkonversi class Restaurant menjad class managed object dengan menimpa code asli Restaurant.swift dengan code dibawah ini:

Managed Object merupakan subclass dari NSManagedObject yang merepresentasikan entity. Di Swift, kita tambahkan attribut @NSManaged sebelum entity dari Restaurant. Setelah kita mengkonversi class Restaurant kedalam managed object, petakan itu kedalam entity. Pilih entity Restaurant di file FoodPin.xcdatamodeld. Dibawah Data Model Inspector, isi classnya dengan FoodPin.Restaurant, seperi pada gambar dibawah ini:

Tempat entity dengan class FoodPin Restaurant
Tempat entity dengan class FoodPin Restaurant

Ketika menggunakan subclass Swift dari class NSManagedObject, seharusnya hal itu akan menjadikan nama class di field Class dengan nama dari modul kita.

Sekarang managed object telah dibuat. Tetapi kita harus mengganti tipe properties dari gambar dan isVisited, karena Xcode mendetksi beberapa error di project kita. Untuk menyelesaikannya kita harus membuat beberapa perubahan. Pertama pada file RestaurantTableViewController.swift kita tidak menggunakan nama file lagi untuk mengambil gambar.

cell.thumbnailImageView.image = UIImage(named: restaurant.image)

Karena sekarag gambar telah tersimpan di object data. Untuk mengambi gambar, harus menggunakan code dibawah ini:

cell.thumbnailImageView.image = UIImage(data: restaurant.image)

Aplikasikan hal yang sama pada file MapViewController.swift, jadi ganti code yang ada menggunakan data gambar:

leftIconView.image = UIImage(data: restaurant.image)

Dan juga terjadi error yang sama pada file DetaiViewController, sekali lagi timpa inisiasi image dengan parameter data:

self.restaurantImageView.image = UIImage(data: restaurant.image)

Error selanjutnya yang muncul adalah pada bagian code dibawah ini:

cell.favorIconImageView.hidden = !restaurant.isVisited

Itu dikarenakan restaurant.isVisited tidak lagi menggunakan tipe Bool, karena sekangan menggunakan propertu NSNumber. Oleh karena itu kita harus menggantinya untuk mendapatkan nilai boolean dengan code dibawah ini:

cell.favorIconImageView.hidden = !restaurant.isVisited.boolValue

Tapi masih ada error lagi nih, yaitu pada variaebl isVisited di file DetailViewController.swift. Karena tidak lagi menggunakan tipe boolean, yaitu pada statement ini:

cell.valueLabel.text = (restaurant.isVisited) ? "Yes, I've been here before" : "No"

Sekali lagi kita harus mengakses property boolValue untuk mendapatkan value boolean:

cell.valueLabel.text = (restaurant.isVisited.boolValue) ? "Yes" : "No"

Error terakhir yaitu pada array restaurant pada file RestaurantTableViewController. Karena kita sekarang telah menyimpan restaurant di database, kita harnya perlu mendekkrasikannya arraynya dengna array yang kosong:

var restaurants:[Restaurant] = []

Anda bisa mendownload project fixnya disini: (https://www.dropbox.com/s/tguyzbr95ecawpa/FoodPinCoreDataTemplate2.zip?dl=0). Dan ketika dijalankan aplikasi kita hanya akan menampilkan table kosong karena belum ada data sama sekali yang disimpan di database.

Selajutnya kita akan mengimplementasikan class AddTableViewController dan menyimpan restaurant yang baru ke dalam database. Lanjut ke Part II Guys ..

Iklan

2 pemikiran pada “Core Data di iOS Part I – FoodPin Apps

  1. Bang wira keren bang dari awal saya nyimak dari chapter awal sam saat ini cuma mikir, ini buat nyimpen file pake apaan ya …. Ternyata ini jawabannya. Greget mau nyoba, ada rencana mau beli macbook air, eh ngeliat penjelasan di chapter 1 minimal standart jecepatan proc 2.5Ghz jadi loyo saya hahaah, betapa mahalnya macbook, saya pingin banget mulai start dari sekarang tapi sayangnya harus punya mac. Bisa gak ya swift inj dijalankan di Windows ? Terima kasih bang wira sehat dan sukses selalu,terus berbagi tutorial ya mas (y).

    Suka

    1. Thanks udah berkunjung Febrian, …

      Kalau buat native app development mending Macbook Pro, iya sih mahal. Tapi mahal di awal, nantinya bakal kebayar kok kalau udah manfaat semua fitur yang ada di dalamnya dengan maximal.

      Suka

Good People write good comments ..

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s