Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Core Data
Code

Core Data dan Swift: Hubungan dan Lebih Banyak Pengambilan

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Core Data and Swift.
Core Data and Swift: Managed Objects and Fetch Requests
Core Data and Swift: NSFetchedResultsController

Indonesian (Bahasa Indonesia) translation by Andy Nur (you can also view the original English article)

Pada artikel sebelumnya, kita belajar tentang NSManagedObject dan betapa mudahnya membuat, membaca, memperbarui, dan menghapus record menggunakan Core Data. Namun, saya tidak menyebutkan hubungan dalam diskusi itu. Selain beberapa peringatan yang perlu kamu sadari, hubungan relasi sama mudahnya untuk memanipulasinya sebagai atribut. Pada artikel ini, kita akan fokus pada hubungan relasi dan kita juga akan melanjutkan eksplorasi NSFetchRequest kita.

Prasyarat

Apa yang saya bahas pada seri ini pada Core Data ini berlaku untuk iOS 7+ dan OS X 10.10+, tetapi fokusnya akan pada iOS. Pada seri ini, saya akan bekerja dengan Xcode 7.1 dan Swift 2.1. Jika kamu memilih Objective-C, maka saya sarankan membaca seri sebelumnya pada framework Core Data.

1. Hubungan Relasi

Kita sudah bekerja dengan hubungan relasi di model editor Core Data dan yang akan saya ceritakan kepadamu akan terdengar akrab. Hubungan relasi, seperti atribut, yang diakses menggunakan kode nilai-kunci. Ingat bahwa model data yang kita buat sebelumnya dalam seri ini mendefinisikan entitas Person dan entitas Address. Seseorang terhubung dengan satu atau lebih alamat dan alamat terkait dengan satu atau lebih orang. Ini adalah hubungan relasi many-to-many.

Untuk mengambil alamat seseorang, kita cukup memanggil valueForKey(_:) pada orang tersebut, sebuah instance NSManagedObject, dan masukkan addresses sebagai kuncinya. Perhatikan bahwa addresses adalah kunci yang kita tetapkan dalam model data. Jenis objek apa yang kamu harapkan? Kebanyakan orang yang baru menggunakan Core Data mengharapkan array yang diurutkan, tetapi Core Data mengembalikan sebuah set, yang tidak disortir. Bekerja dengan set memiliki kelebihan seperti yang akan kamu pelajari nanti.

Membuat Record

Cukup dengan teorinya, buka proyek dari artikel sebelumnya atau klon dari GitHub. Mari kita mulai dengan membuat seseorang dan kemudian dihubungkan ke alamat. Untuk membuat seseorang, buka AppDelegate.swift dan perbarui application(_:didFinishLaunchingWithOptions:) seperti yang ditunjukkan di bawah ini.

Ini seharusnya terlihat akrab jika kamu telah membaca artikel sebelumnya. Membuat alamat terlihat mirip seperti yang kamu lihat di bawah ini.

Karena setiap atribut dari entitas Address ditandai sebagai opsional, kita tidak perlu untuk menetapkan nilai ke atribut masing-masing. Dalam contoh ini, kita hanya menetapkan atribut record street dan city.

Membuat Hubungan Relasi

Untuk menautkan newAddress ke newPerson, kita memanggil valueForKey(_:), teruskan addresses sebagai kuncinya. Nilai yang kita berikan adalah instance NSSet yang berisi newAddress. Lihatlah blok kode berikut untuk klarifikasi.

Kami memanggil save() pada konteks objek yang dikelola dari newPerson untuk menyebarkan perubahan ke penyimpanan yang persisten. Ingat bahwa itu memanggil save() pada konteks objek yang dikelola menyimpan keadaan konteks objek yang dikelola. Ini berarti bahwa newAddress juga ditulis ke penyokong penyimpan serta hubungan relasi yang baru saja kita definisikan.

Kamu mungkin bertanya-tanya mengapa kita tidak menautkan newPerson ke newAddress, karena kita mendefinisikan hubungan terbalik dalam model data. Core Data membuat hubungan relasi ini untuk kita. Jika sebuah hubungan relasi memiliki hubungan relasi terbalik, maka Core Data mengurus ini secara otomatis. Kamu dapat memverifikasi ini dengan meminta newAddress untuk persons-nya.

Mengambil dan Memperbarui Hubungan Relasi

Memperbarui sebuah hubungan relasi tidak sulit juga. Satu-satunya peringatan adalah bahwa kita perlu menambahkan atau menghapus elemen dari instance NSSet Core Data yang tidak dapat diubah kepada kita. Untuk membuat tugas ini lebih mudah, protokol NSKeyValueCoding menyatakan kenyamanan metode mutableSetValueForKey(_:), yang mengembalikan objek NSMutableSet. Kita kemudian hanya dapat menambahkan atau menghapus item dari koleksi untuk memperbarui hubungan relasinya.

Lihatlah blok kode berikut di mana kita membuat alamat lain dan mengaitkannya dengan newPerson. Kita melakukan ini dengan menerapkan mutableSetValueForKey(_:) pada newPerson dan menambahkan otherAddress ke set yang bisa berubah. Tidak perlu memberitahu Core Data bahwa kita telah memperbarui hubungan relasinya. Core Data melacak set yang bisa berubah yang diberikan ke kita dan memperbarui hubungan relasinya.

Menghapus Hubungan Relasi

Kamu dapat menghapus hubungan dengan menerapkan setValue(_:forKey:), teruskan nil sebagai nilai dan nama hubungan relasinya sebagai kunci. Pada cuplikan kode berikutnya, kita membatalkan tautan setiap alamat dari newPerson.

2. Hubungan Relasi One-To-One dan One-To-Many

Hubungan Relasi One-to-One

Meskipun model data kita tidak mendefinisikan hubungan one-to-one, kamu telah mempelajari semua yang perlu kamu ketahui untuk bekerja dengan jenis hubungan relasi ini. Bekerja dengan hubungan one-to-one identik dengan bekerja dengan atribut. Satu-satunya perbedaan adalah bahwa nilai yang kamu dapatkan kembali dari valueForKey(_:) dan nilai yang kamu berikan kepada setValue(_:forKey:) adalah instance NSManagedObject.

Mari perbarui model data untuk mengilustrasikan ini. Buka Core_Data.xcdatamodeld dan pilih entitas Person. Buat hubungan baru dan beri nama spouse. Atur entitas Person sebagai tujuan dan tetapkan hubungan relasi spouse sebagai hubungan relasi terbalik.

Add a One-To-One Relationship to Person

Seperti yang kamu lihat, ini memungkinkan untuk membuat sebuah hubungan relasi di mana tujuan hubungan relasinya adalah entitas yang sama dengan entitas yang mendefinisikan hubungan relasi. Perhatikan juga bahwa kita selalu menetapkan kebalikan dari hubungan relasi. Seperti yang dinyatakan oleh dokumentasi Apple, ada beberapa situasi di mana kamu ingin menciptakan hubungan relasi yang tidak memiliki hubungan terbalik.

Tahukah kamu apa yang akan terjadi jika kamu membuat dan menjalankan aplikasi? Benar, aplikasinya akan crash. Karena kita mengubah model data, penyokong penyimpan yang ada, dalam contoh ini sebuah database SQLite, sudah tidak kompatibel dengan data model. Untuk memperbaikinya, hapus aplikasi dari perangkatmu atau simulator dan jalankan aplikasi. Namun jangan khawatir, kita akan menyelesaikan masalah ini dengan lebih elegan dalam angsuran berikutnya menggunakan migrasi.

Jika kamu dapat menjalankan aplikasi tanpa masalah, maka saatnya untuk langkah berikutnya. Kembali ke aplikasi delegasi class dan tambahkan blok kode berikut.

Untuk menetapkan anotherPerson sebagai pasangan dari newPerson, kita memanggil setValue(_:forKey:) pada newPerson dan meneruskan anotherPerson dan "spouse" sebagai argumen. Kita dapat mencapai hasil yang sama dengan menerapkan setValue (_: forKey :) pada anotherPerson, teruskan newPerson dan "pasangan" sebagai argumen.

Hubungan Relasi One-to-Many

Mari kita selesaikan dengan melihat hubungan relasi one-to-many. Buka Core_Data.xcdatamodeld, pilih entitas Person, dan buat hubungan bernama children. Setel tujuannya ke Person, atur jenisnya ke To Many, dan biarkan hubungan relasi terbalik kosong untuk saat ini.

Add a One-To-Many Relationship to Person

Buat hubungan relasi lain bernama father, tetapkan tujuan ke Person, dan atur hubungan terbalik dengan children. Ini secara otomatis akan mengisi hubungan relasi terbalik dari hubungan relasi children yang kita biarkan kosong beberapa saat yang lalu. Kita sekarang telah menciptakan hubungan one-to-many, yaitu, seorang ayah dapat memiliki banyak anak, tetapi seorang anak hanya dapat memiliki satu ayah biologis.

Add a One-To-Many Relationship to Person

Kembali ke delegasi aplikasi dan tambahkan blok kode berikut. Kita membuat record Person yang lain, atur atributnya, dan atur sebagai children dari newPerson dengan meminta Core Data untuk sebauh set yang dapat berubah untuk kunci children dan menambahkan record baru ke set yang bisa berubah.

Blok kode berikut menyelesaikan hasil yang sama dengan menetapkan atribut father dari anotherChildPerson. Hasilnya adalah newPerson menjadi bapak dari otherChildPerson dan anotherChildPerson menjadi anak dari newPerson.

3. Lebih Banyak Mengambil

Model data dari aplikasi contoh kita telah berkembang sedikit dalam hal kompleksitas. Kita telah membuat hubungan one-to-one, one-to-many, dan many-to-many. Kita telah melihat betapa mudahnya membuat record, termasuk hubungan relasi. Jika kita juga ingin dapat menarik data tersebut dari penyimpanan yang persisten, maka kita perlu belajar lebih banyak tentang pengambilan. Mari kita mulai dengan contoh sederhana di mana kita melihat bagaimana mengurutkan hasil yang dikembalikan oleh permintaan pengambilan.

Mengurutkan Deskriptor

Untuk mengurutkan record yang kita dapatkan dari konteks objek yang dikelola, kita menggunakan class NSSortDescriptor. Lihatlah potongan kode berikut.

Kita menginisialisasi permintaan pengambilan dengan meneruskan entitas yang kita minati, Person. Kita kemudian membuat objek NSSortDescriptor dengan memanggil init(key:ascending:), teruskan atribut dari entitas yang ingin kita urutkan berdasarkan, first, dan boolean yang menunjukkan apakah record perlu diurutkan dalam urutan ascending atau descending.

Kita menggabungkan deskripsi semacam ini ke permintaan pengambilan dengan mengatur properti sortDescriptors dari permintaan pengambilan. Karena properti sortDescriptors adalah tipe [NSSortDescriptor]?, adalah mungkin untuk menentukan lebih dari satu jenis deskriptor. Kita akan melihat opsi ini sebentar lagi.

Sisa dari blok kode harus terlihat akrab. Permintaan pengambilan diteruskan ke konteks objek yang dikelola, yang mengeksekusi permintaan ambil ketika kita menjalankan executeFetchRequest(_:). Ingat bahwa yang terakhir adalah metode throwing, yang berarti bahwa kita menggunakan kata kunci try dan mengeksekusi permintaan pengambilan dalam pernyataan do-catch.

Jalankan aplikasi dan periksa output di konsol Xcode. Outputnya akan terlihat seperti apa yang ditunjukkan di bawah ini. Seperti yang kamu lihat, record diurutkan berdasarkan nama depannya.

Jika kamu melihat duplikat dalam output, maka pastikan untuk mengomentari kode yang kita tulis sebelumnya untuk membuat record. Setiap kali kamu menjalankan aplikasi, record yang sama dibuat, menghasilkan duplikat record.

Seperti yang saya sebutkan, ini memungkin untuk menggabungkan beberapa jenis deskriptor semacam. Mari kita urutkan catatan berdasarkan lastname dan age-nya. Kita pertama-tama mengatur kunci dari deskriptor semacam pertama ke last. Kita kemudian membuat deskriptor semacam lainnya dengan kunci age dan menambahkannya ke array deskriptor semacam.

Output menunjukkan bahwa urutan deskriptor semacam dalam array itu penting. Record-record ini pertama kali diurutkan berdasarkan nama belakang mereka dan kemudian berdasarkan usia mereka.

Predikat

Deskriptor semacam bagus dan mudah digunakan, tetapi predikat adalah sesuatu yang benar-benar membuat pengambilan menjadi kuat di Core Data. Deskripsi semacam memberitahu Core Data bagaimana record perlu diurutkan. Predikat memberitahu Core Data tentang catatan yang kamu minati. Class yang akan kita kerjakan adalah NSPredicate.

Mari kita mulai dengan mengambil setiap anggota keluarga Doe. Ini sangat mudah dilakukan dan sintaksnya akan mengingatkanmu tentang SQL.

Kira tidak banyak berubah selain membuat objek NSPredicate dengan memanggil init(format:argumen:) dan mengikat predikat ke permintaan pengambilan dengan menetapkan properti predicate yang terakhir. Perhatikan bahwa meotde init(format:arguments:) menerima sejumlah argumen variabel.

String format predikat menggunakan %K untuk nama properti dan %@ untuk nilainya. Sebagaimana dinyatakan dalam Panduan Pemrograman Predikat, %K adalah substitusi argumen variabel untuk jalur kunci, sementara %@ adalah substitusi argumen variabel untuk nilai objek. Ini berarti bahwa string format predikat dari contoh kita menilai ke last == "Doe".

Jika kamu menjalankan aplikasi dan memeriksa output di konsol Xcode, kamu akan melihat hasil berikut:

Ada banyak operator yang bisa kita gunakan untuk perbandingan. Selain = dan ==, yang identik sejauh menyangkut Core Data, ada juga >= dan =>, <= dan =>, != dan <>, dan > dan <. Saya mendorongmu untuk bereksperimen dengan operator ini untuk mempelajari bagaimana mereka memengaruhi hasil permintaan pengambilan.

Predikat berikut menggambarkan bagaimana kita dapat menggunakan operator >= untuk hanya mengambil record Person dengan atribut age yang lebih dari 30.

Kita juga memiliki operator untuk perbandingan string, CONTAINS, LIKE, MATCHES, BEGINSWITH, dan ENDSWITH. Mari kita ambil setiap catatan Person yang namanya CONTIANS huruf j.

Jika kamu menjalankan aplikasi, array hasilnya akan kosong karena perbandingan string bersifat case sensitive secara default. Kita dapat mengubahnya dengan menambahkan pengubah seperti ini:

Kamu juga dapat membuat predikat gabungan menggunakan kata kunci AND, OR, dan NOT. Dalam contoh berikut, kita mengambil setiap orang yang nama depannya mengandung huruf j dan lebih muda dari 30.

Predikat juga membuatnya sangat mudah untuk mengambil catatan berdasarkan hubungan mereka. Dalam contoh berikut, kita mengambil setiap orang yang nama ayahnya sama dengan Bart.

Predikat di atas bekerja seperti yang diharapkan, karena %K adalah substitusi argumen variabel untuk key path, bukan hanya key.

Yang perlu kamu ingat adalah predikat itu memungkinkanmu untuk meminta informasi penyokong penyimpan tanpa kamu mengetahui apa pun tentang penyimpan tersebut. Meskipun sintaks string format predikat mengingatkan pada SQL dalam beberapa hal, tidak masalah jika penyokong penyimpan adalah database SQLite atau penyimpan di memori. Ini adalah konsep yang sangat kuat yang itu tidak unik untuk Core Data. Rails Active Record adalah contoh lain dari paradigma ini.

Ada lebih banyak predikat daripada apa yang saya tunjukkan dalam artikel ini. Jika kamu ingin mempelajari lebih lanjut tentang predikat, saya sarankan kamu mencapai puncak di Panduan Pemrograman Predikat Apple. Kita juga akan bekerja lebih banyak dengan predikat di beberapa artikel berikutnya dari seri ini.

Kesimpulan

Anda sekarang memiliki pemahaman yang baik tentang dasar-dasar Core Data dan saatnya untuk mulai bekerja dengan kerangka kerja dengan membuat aplikasi yang memanfaatkan kekuatan Core Data. Pada artikel berikutnya, kita bertemu kelas penting lainnya dari framework Core Data, NSFetchedResultsController. Class ini akan membantu kita mengelola koleksi rekaman, tetapi kamu akan belajar bahwa itu cukup lebih dari itu.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.