Menggunakan Core Data di SwiftUI

Cara Integrasi core data ke dalam framework SwiftUI

Ricky Austin
Dipantry
4 min readOct 18, 2020

--

Core Data adalah sebuah framework yang diciptakan Apple untuk mengatur layer model di dalam sebuah aplikasi (iOS dan MacOS). Jika kalian tahu metode Model View Controller, maka Core Data berperan sebagai Model disana. Core Data memungkinkan kita untuk melakukan Create, Read, Update, Delete (CRUD) pada data yang akan diolah dan semuanya akan disimpan secara offline di dalam device.

Pada Swift 5 kita menginisialisasi fungsi Core Data dengan kode berikut :

Kode di atas memungkinkan untuk melakukan fungsi CRUD terhadap container / tempat penyimpanan yang terdapat di AppDelegate. Namun, kode hanya berjalan hanya ketika benar-benar dipanggil. Sedangkan di SwiftUI, fungsi ini sudah diterapkan dalam environment-nya sejak aplikasi dimuat. Jadi fungsi seperti fetching bisa dilakukan langsung dari AppDelegate tanpa harus diinisialisasi terlebih dahulu.

Untuk memperoleh kemudahan dalam penggunaannya dalam SwiftUI, ada beberapa fitur yang perlu diperhatikan :

  1. NSManagedObject, untuk menggabungkan objek apapun sebagai bagian dari User Interface (UI)
  2. managedObjectContext, untuk menyimpan Core Data yang aktif ke dalam object context
  3. @FetchRequest, merupakan property wrapper yang menggunakan managedObjectContext untuk melakukan fetching.

Kita akan menggunakan fitur diatas untuk melakukan semua fungsi CRUD di SwiftUI. Untuk itu, kita akan coba memakainya dalam sebuah aplikasi sederhana.

Setting Up

Pertama kita mulai project baru di Xcode dengan : File > New > Project > App. Lalu lakukan pengaturan sebagai berikut :

Sebenarnya di Xcode 12, kita dapat memilih Life Cycle antara UIKit atau SwiftUI. Dimana di SwiftUI Life Cycle, file seperti AppDelegate dan SceneDelegate sudah tidak ada lagi karena jadi satu dengan aplikasi. Namun, kita akan menggunakan UIKit untuk mengetahui cara kerja dari Core Data-nya.

Setelah selesai, jika kita melihat file SceneDelegate.swift, maka akan terdapat fungsi berikut didalam func scene() :

Disana, konstanta context menginisialisasi sebuah fungsi Core Data. Lalu, konstanta tersebut ditempatkan dalam environment pada ContentView() yang menjadi root dari aplikasinya. Apabila kita ingin melakukan pengolahan data di struct lain, kita cukup memanggil fungsi .managedObjectContext .

Create App

Kita akan membuat sebuah aplikasi To-Do List, dengan memanfaatkan semua fungsi CRUD dari Core Data. Sebelum mulai mendesain tampilan, kita buat terlebih dahulu atribut data di .xcdatamodeld .

Setelah itu, masuk ke struct ContentView dan gunakan kode berikut sebagai tampilan awalnya:

Read

Sekarang kita akan menggunakan fitur Core Data yang disediakan oleh SwiftUI. Setelah selesai membuat data modelnya, kita mulai panggil fungsinya di dalam ContentView.swift dengan:

Variabel managedObjectContext berguna untuk membaca objek konteks, sedangkan variable daftarKegiatan untuk menampung data yang dikirim data model. Lalu, kita gunakan template berikut sebagai UI aplikasinya :

Setelah tampilan dibuat, sekarang kita memanggil fungsi fetch dengan mengganti Text(“daftar kegiatan”) dengan kode berikut :

Jadi kita akan menggunakan looping pada daftarKegiatan untuk memanggil setiap record pada data model, dan disini kita akan menampilkan atribut data bernama “keterangan”. Setelah itu kita coba jalankan aplikasi dengan menggunakan emulator, sebab struct ContentView_Previews tidak bisa menampilkan data yang nil. Disini kita akan melihat tampilan tabel yang kosong, karena memang belum ada data yang dimasukkan. Setelah ini akan belajar untuk menambahkan datanya.

Create

Untuk menambahkan datanya, kita akan memanfaatkan managedObjectContext . Untuk itu kita perlu buat fungsi berikut :

Disini kita akan memasukkan beratribut “id” dengan UUID() dan “keterangan ” dengan textfield yang akan diisi. Setelah itu kita akan memanggil fungsi saveContext() untuk menyimpan perubahan. Namun ada yang kurang, func simpan() tidak dipanggil, oleh karena itu tambahkan kode berikut di dalam tombol pada .navigationBarItems() :

Sekarang coba jalankan aplikasinya lagi maka kita sudah dapat menambahkan data dan menampilkan hasilnya pada tabel. Di tahapan selanjutnya kita akan belajar mengenai cara menghapus datanya.

Delete

Untuk menghapus data kita cukup menambahkan kode berikut :

Dengan memanfaatkan fungsi saveContext() , kita menghapus data berdasarkan index dari tabel. Agar fungsi dapat berjalan, tambahkan kode berikut pada setelah ForEach() :

Nah sekarang kita dapat mengahapus baris tabel dengan melakukan swipe ke kiri. Lalu, bagaimana jika kita ingin mengubah data yang ada? Setelah ini kita akan masuk ke pembahasan terakhir yaitu update data.

Update

Untuk melakukan update, kita perlu membuat halaman khusus, karena itu kita buat dulu tampilannya dengan membuat struct baru bernama UpdateData():

Disini kita perlu panggil lagi environment-nya dalam managedObjectContext . Untuk memanggil struct ini sendiri, pada halaman ContentView.swift tambahkan kode berikut di dalam ForEach() :

Setelah selesai, kita buat fungsi update dengan kode berikut pada UpdateData.swift :

Setelah ini kita panggil fungsinya dengan menambahkan update() pada tombol di navigation bar. Pada intinya, cara kerjanya sama dengan simpan data, hanya saja kita tidak membuat baris baru, dan perubahan data dilakukan berdasarkan “id” yang ada. Tidak lupa kita juga tambahkan presentasionMode.wrappedValue.dismiss() setelah saveContext() , untuk menutup modal setelah proses update berhasil.

Penutup

Akhirnya selesai juga, sekarang aplikasi kita sudah memiliki semua fungsi CRUD. Namun, masih ada beberapa hal yang dapat dikembangkan lebih dalam hal MVC-nya , sebab @FetchRequest masih harus dipanggil di setiap struct yang memerlukannya. Mungkin hal itu akan dibahas di artikel berikutnya. Terima kasih telah membaca :), apabila dirasa bermanfaat, bagikan juga artikel ini kepada yang lain ya!

--

--

Ricky Austin
Dipantry

Currently undergraduate Informatics student. I have interest in Mobile Development while enjoying talking about future things