Core Data di iOS Part II – FoodPin Apps

Melanjutkan seri tutorial Core Data sebelumnya, so check this out ..

Menggunakan Managed Object

Cara untuk memasukkan object Restaurant sebagai berikut:

  • Mendapatkan context managed object dari AppDelegate
    let managedObjectContext = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext
  • Membuat managed object untuk entity
    RestaurantinsertNewObjectForEntityForName("Restaurant", inManagedObjectContext: managedObjectContext) as Restaurant
  • Memberitahu context untuk menyimpan object baru kedalam database
    managedObjectContext.save(&e)

 

Menyimpan Restaurant yang baru kedalam Database

Dengan ide dasar tetnang bagaimana menggunakan managed object, mari kita perbarui class AddTableViewController untuk menyimpan restaurant baru kedalam database.

Pertama kali, import Core Data di awal file dari AddTableViewController.swift sehingga class data tersebut bisa digunakan oleh Core Data framework:

import CoreData

Deklarasikan sebuah variabel restaurant pada class AddTableViewController:

var restaurant:Restaurant!

Pada method save, kita aplikasikan apa yang telah kita pelajari dan simpan object restaurant kedalam media penyimpanan. Letakkan code berikut setelah form validasi:

Code di atas sebenarny hampir sama dengan yang telah kita bahas di postingan sebelumnya, yang membedakannya hanya pada dua baris code. Pertama yang berhubungan dengan property image.

restaurant.image = UIImagePNGRepresentation(imageView.image)

Setelah kita melakukan perubahan tipe dari properti image dari String ke NSData, kita gunakan fungsi UIImagePNGRepresentation untuk mendapatkan data gambar dari gambar yang dipilih.

Property restaurant.isVisited bertipe NSNumber, di Swift itu akan secara otomatis menghubungkan tipe nomor native seperti Int, Uint, Float, Double, dan Bool ke NSNumber. Inilah kenapa isVisited bisa digunakan untuk restaurant.isVisited secara langsung.

restaurant.isVisited = isVisited

Jika kita menjalankan aplikasi sekarang dan menyimpan restaurant yang baru, aplikasi harunsya juga telah menyimpan data tersebut kedalam database tanpa adanya error. Tetapi aplikasi belum siap untuk menampilkan restaurant yang telah kita tambahkan, itu lah yang akan kita lakukan selanjutnya


 

Mengambil Data Menggunakan Core Data

Untuk mengambil data menggunakan Core Data, cara termudah adalah dengan menggunakan method yang sesuai yang bertanggung jawab untuk context managed object:

Dengan menginisialiasi NSFetchRequest dengan entity yang spesifik, kita bisa memanggil method executeFetchRequest untuk mendapatkan array dari object Restaurant. Sehingga kita bisa menambahkan code diatas pada method viewWillAppear untuk mengambil object restaurant terakshir dari database.

Tetapi kita tidak akan menggunakan method tersebut untuk mengambil data. Karena ada method yang lebih mudah digunakan yang dinamakan dengan NSFetchedResultController. Selain karena mudah digunakan adalah karena performanya yang baik. Ketika kita menambahkan data baru atau menghapus data dari database, kita mengambil semua data restaurant dari database dan menampilkannya kembali kedalam table view. Tentu hal ini tidak efisien untuk mengatur data. Cara terbaik adalah dengan cara berikut:

  • Ketika menambahkan data baru, kita menambahkan row baru di table view
  • Ketika menghapus sebuah data, kita hanya harus mengapus row tersebut pada table view.

Fetched Result Controller di design spesial untuk mengatur hasil dari data ketika Core Data mengambil dan menampilkanya ke table view. Dimana Fetched Result Controller lah yang memonitor perubah object di context managed object dan melaporkan perubahannya sebagai hasilnya.

Mari kita lihat bagaimana kita bisa menggunakan NSFetchedResultController. Di file RestaurantTableViewController.swift, masukkan CoreData framework:

import CoreData

Dan kaitkan protocol NSFetchedResultControllerDelegate :

class RestaurantTableViewController:UITableViewController, NSFetchedResultsControllerDelegate

Protocol NSFetchedResultControllerDelegate bertanggung jawab untuk memberitahu delegate ketika adanya perubahan pada hasil pengambillan controller. Terakhir kita akan implementasikan sebuah protocol tersebut.

Selanjutnya deklarasikan variabel instance untuk mengambil hasil controller:

var fetchResultController:NSFetchedResultsController!

Sekarang tambahkan code dibawah ini pada method viewDidLoad:

Pertama kita buat NSFetchRequest dengan entity Restaurant dan menentukan urutannya menggunakan NSSortDecriptor. NSSortDescriptor memperbolehkan kita untuk mendeskripsikan urutan dari object yang diambil dengan properti yang spesifik untuk membanding objectnya. Kita juga bisa menspesifikasikan urutannya dari besar kekecil atau sebaliknya.

Setelah membuat fetch request, kita inisialiasi fetched result controller dan delegatenya untuk memonitor perubahan data. Terakhir kita panggil method performFetch untuk mengeksekusi fetch request. Ketika selesai, kita sudah mendapatkan object restaurant.

Jika kita meng-compile dan menjalankan aplikasi sekarang, seharunya akan menampilkan restaurant yang barusan kita tambahkan. Tetapi jika kita ingin menambahkan restaurant lainnya, table tidak akan me-refresh pembaharuan dari data yang ditambahkan. Itulah yang akan kita lakukan selanjutnya.

Ketika terjadi perubah pada konten, method berikut dari NSFetchedResultControllerDelegate akan dipanggil:

  • controllerWillChangeContent(_:)
  • controller(_:didChangeObject:atIndexPath:forChangeType:newIndexPath:)
  • controllerDidChangeContent(_:)

Berikut implemenasinya, letakkan code dibawah ini pada class RestaurantTableViewController:

Method pertam di panggil ketika hasil controller telah di ambil dan siap untuk memproses perubahan konten. Kita hanya perlu memberitahu table view, “Oi, sudah siap untuk mengupdate table, jadi bersiap-siap.”

Ketika ada perubah konten di managex context, method kedua dipanggil. Disini kita tentukan tipe dari operasi dan memprosesna dengan operasi yang cocok. Sebagai contoh, kita tambahkan row baru ketika tipenya dalam mode insert. Ketika object di fetched result controller telah barubah, kita sinkronisasikan dengan array restaurant yang ada di akhir method.

Setelah fetched result controoler telah selesai dirubah, maka akan memanggil method controllerDidChangeContent. Kita hanya perlu memberi tahu table view bahwa kita telah selesai mengupdate dan siap untuk memperbarui tampilan.

Yups, beres juga akhirya, coba jalankan aplikasi kembali, dan buat bebera restaurant baru yang harusnya aplikasi sudah berjalan seperti yang kita inginkan.


 

Menghapus Data menggunakan Core Data

Hampir sama dengan menambahkan data, kita hanya perlu memanggil method untuk memberitahu contect managed object bawah sudah adanya data yang telah di hapus pada data penyimpanan. Kemudian kita panggil method save untuk menyimpan perubahan. Berikut potongan codenya:

managedObjectContext.deleteObject(restaurantToDelete)

Jadi untuk menghapus restaurant yang dipilih dari database, kita hanya perlu meng-update variabel deleteAction pada method tableView(_:editActionForRowAtIndexPath:) dengan code berikut:

Sekarang compile dan jalankan aplikasi kembali, coba hapus salah satu data maka seharunya data tersebut sudah benar-benar terhapus.


 

Menampilkan Raw SQL Statement

Salah satu kelebihan dari Cora Data adalah developer tidak perlu lagi untuk mempelajari SQL. Kita bisa berinteraksi dengan data yang telah tersimpan di database tanpa perlu mempelajari SQL atau menulis SQL. Tetapi akan lebih baik jika kita mengetahui tentang database, seperti SQL karena ini nantinya akan berguna untuk aplikasi lainnya.

Xcode memperbolehkan developer untuk mengaktfikan SQL output untuk mendebug. Untuk mengaktifkannya, klik kanan FoodPin dan pilih “Edit Scheme” seperti yang terlihat pada gambar dibawah ini:

Mengedit skema project Xcode
Mengedit skema project Xcode

Pilih tamb “Argument”, dibawah pilihan ”Argument Passed on Launch” klik tomol + dan tambahkan paramater “-com.apple.CoreData.SQLDebug 1” seperti gambar berikut:

Menambahkan SQL Debug Parameter
Menambahkan SQL Debug Parameter

Klik OK untuk mengkonfrimasi, sekarang jalankan aplikasi kembali dan kita akan melihat SQL statement pada window console. Berikut contohnya:

Well mungkin cukup sekian pembahasan kali ini, oya untuk contoh code bisa di download disini: https://www.dropbox.com/s/2ajukcll7cvht99/FoodPinCoreData.zip?dl=0

Semoga Bermanfaat ya Guys, See yaa .. 😉

Iklan

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