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

Core Data dan Swift: Perhubungan dan Pengambilan Lebih Banyak

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

Malay (Melayu) translation by Neurion (you can also view the original English article)

Dalam artikel sebelumnya, kami belajar tentang NSManagedObject dan betapa mudahnya untuk membuat, membaca, mengemas kini, dan memadam rekod menggunakan Data Teras. Walau bagaimanapun, saya tidak menyebut hubungan dalam perbincangan itu. Selain daripada beberapa peringatan yang perlu anda ketahui, hubungan semudah itu dapat dimanipulasi sebagai sifat. Dalam artikel ini, kami akan memberi tumpuan kepada hubungan dan kami juga akan meneruskan penerokaan NSFetchRequest kami.

Prasyarat

Apa yang saya saksikan dalam siri ini pada Data Teras boleh diguna pakai untuk iOS 7 dan OS X 10.10, tetapi fokusnya adalah pada iOS. Dalam siri ini, saya akan bekerjasama dengan Xcode 7.1 dan Swift 2.1. Jika anda lebih suka Objektif-C, maka saya cadangkan membaca siri awal saya mengenai rangka Data Teras.

1. Hubungan

Kami telah bekerja dengan perhubungan di dalam editor model Data Teras dan apa yang saya katakan kepada anda akan jadi terdengar akrab. Hubungannya, seperti atribut, diakses menggunakan pengekodan nilai utama. Ingat bahawa model data yang kami buat lebih awal dalam siri ini mentakrifkan entiti Orang dan entiti Alamat. Seseorang dikaitkan dengan satu atau lebih alamat dan satu alamat dihubungkan dengan satu atau lebih orang. Ini adalah hubungan yang banyak.

Untuk mengambil alamat seseorang, kami hanya memohon valueForKey(_:) pada orang itu, contoh NSManagedObject, dan lulus alamat sebagai kunci. Perhatikan bahawa alamat adalah kunci yang kami tentukan dalam model data. Apakah jenis objek yang anda jangkakan? Kebanyakan orang yang baru untuk Data Teras mengharapkan pelbagai disusun, tetapi Data Core mengembalikan set, yang tidak disokong. Bekerjasama dengan set mempunyai kelebihan yang akan anda pelajari kemudian.

Mencipta Rekod

Cukup dengan teori itu, buka projek dari artikel sebelumnya atau klikannya dari GitHub. Mari mulakan dengan mencipta seseorang dan kemudian hubungkannya ke alamat. Untuk mencipta seseorang, buka AppDelegate.swift dan mengemaskini application(_:didFinishLaunchingWithOptions:) seperti yang ditunjukkan di bawah.

Ini harus melihat biasa jika anda telah membaca artikel sebelumnya. Mewujudkan satu alamat kelihatan serupa seperti yang anda lihat di bawah.

Kerana setiap atribut bagi entiti-entiti alamat ditanda sebagai pilihan, kita tidak perlu untuk memberikan nilai kepada setiap atribut. Dalam contoh ini, kami hanya menetapkan sifat-sifat jalan dan bandar yang di rekod.

Creating a Relationship

Link newAddress ke newPerson, kami memohon valueForKey(_:) melalui alamat sebagai kekunci. Nilai yang kita lulus adalah contoh NSSet yang mengandungi newAddress. Sila lihat di blok kod berikut untuk penjelasan.

Kami menyeru save() konteks objek yang diuruskan newPerson untuk menyebarkan perubahan ke kedai berterusan. Ingat bahawa menyeru save() konteks diuruskan objek yang menyelamatkan keadaan konteks objek yang diuruskan. Ini bermakna bahawa newAddress juga ditulis untuk storan sokongan serta hubungan kami hanya ditakrifkan.

Anda mungkin tertanya-tanya mengapa kita tidak link newPerson kepada newAddress, kerana kami pula mentakrifkan hubungan songsang dalam data model. Teras Data mewujudkan hubungan ini untuk kita.  Jika hubungan yang mempunyai hubungan songsang, maka teras Data melayani ini secara automatik. Anda boleh mengesahkan ini dengan meminta newAddress bagi persons.

Mencecah dan mengemaskini hubungan yang

Mengemaskini hubungan tidak sukar sama ada. Kaveat hanya adalah bahawa kita perlu menambah atau membuang unsur-unsur dari unsur NSSet yang tidak berubah-ubah teras Data tangan kepada kami.  Untuk memudahkan tugas ini, Walau bagaimanapun, protokol NSKeyValueCoding mengisytiharkan mutableSetValueForKey(_:) kaedah kemudahan yang kembali objek NSMutableSet. Kita boleh kemudian hanya menambah atau mengalih keluar satu item dari koleksi untuk mengemaskini hubungan.

Lihatlah di blok kod yang berikut di mana yang kami cipta alamat lain dan mengaitkannya dengan newPerson. Kita melakukan ini dengan menyeru mutableSetValueForKey(_:) di newPerson dan menambah otherAddress ke mutable set.  Ia tidak perlu untuk memberitahu teras Data bahawa kami telah mengemaskini hubungan. Teras Data terus menjejaki anak set mutable bahawa ia memberi kita dan mengemaskini hubungan.

Menghapuskan hubungan relasi

Anda boleh menghapuskan hubungan yang menyeru setValue(_:forKey:), lulus dalam nil serta nama hubungan sebagai kekunci. Dalam cebisan kod seterusnya, kami Nyahpaut alamat setiap daripada newPerson.

 2. Satu-ke-satu dan Satu-ke-Banyak Perhubungan

Hubungan Satu Kepada Satu

Walaupun model data kami tidak menentukan satu-satu hubungan, anda telah belajar segala-galanya yang anda perlu tahu untuk bekerja dengan jenis ini hubungan.  Bekerja dengan satu-satu hubungan adalah serupa untuk bekerja dengan sifat-sifat. Satu-satunya perbezaan adalah bahawa nilai anda mendapatkan kembali dari valueForKey(_:) dan nilai yang anda lulus untuk setValue(_:forKey:) adalah contoh NSManagedObject.

Mari mengemas kini data model untuk menggambarkan keadaan ini. Buka Core_Data.xcdatamodeld dan pilih entiti Person. Mencipta hubungan baru dan nama spouse. Set entiti Person sebagai destinasi dan set spouse sebagai hubungan songsang.

Add a One-To-One Relationship to Person

Seperti yang anda lihat, ia adalah mungkin untuk mencipta hubungan di mana destinasi hubungan adalah entiti yang sama sebagai entiti yang mentakrifkan hubungan. Juga ambil perhatian bahawa kami sentiasa menetapkan hubungan songsang. Sebagai dalam dokumentasi Apple Syarikat, Terdapat beberapa situasi di mana anda mahu untuk mencipta hubungan yang tidak mempunyai hubungan songsang.

Adakah anda tahu apa akan berlaku jika anda membina dan menjalankan aplikasi tersebut? Itu adalah betul, permohonan akan kemalangan. Kerana kita telah mengubah data model, pada storan simpanan yang sedia ada, pangkalan data SQLite dalam contoh ini, adalah tidak lagi serasi dengan data model.  Untuk mengatasi masalah ini, mengalih keluar aplikasi dari peranti anda atau dalam simulator dan menjalankan aplikasi tersebut. Jangan risau walaupun, kami akan menyelesaikan masalah ini lebih elegan dalam satu ansuran masa hadapan menggunakan pemindahan.

Jika anda boleh menjalankan aplikasi tanpa masalah, maka sudah tiba masanya untuk langkah seterusnya. Menuju kembali ke dalam permohonan wakil kelas dan menambah blok kod berikut.

Untuk menetapkan anotherPerson sebagai isteri kepada newPerson, kami sembah setValue(_:forKey:) pada newPerson dan lulus dalam anotherPerson dan "spouse" sebagai hujah. Kita boleh mencapai keputusan yang sama dengan menyeru setValue(_:forKey:) di anotherPerson, lulus dalam newPerson dan "spouse" sebagai hujah.

Hubungan satu-ke-banyak

Mari kita selesai dengan melihat hubungan satu-ke-banyak. Buka Core_Data.xcdatamodeld, pilih entiti Person, dan mewujudkan hubungan yang dinamakan children. Bakal destinasi Person, set jenis tersebut kepada Ke Banyak, dan kosongkan hubungan songsang sekarang.

Add a One-To-Many Relationship to Person

Mewujudkan hubungan yang satu lagi dinamakan father, bakal destinasi Person, dan menetapkan hubungan songsang untuk children. Ini secara automatik akan mengisi hubungan songsang hubungan children kita dibiarkan kosong sebentar tadi.  Kami kini telah mencipta hubungan satu-ke-banyak, iaitu seorang bapa boleh mempunyai ramai kanak-kanak, tetapi kanak-kanak hanya boleh mempunyai satu bapa biologi.

Add a One-To-Many Relationship to Person

Menuju kembali ke perwakilan permohonan dan tambah di blok kod berikut. Kami mencipta satu lagi rekod Person, menetapkan sifat-sifatnya, dan Tetapkan sebagai seorang kanak-kanak newPerson dengan meminta teras Data satu set mutable untuk children penting dan menambah rekod yang baru ke mutable set.

Blok kod berikut accomplishes keputusan yang sama dengan mengeset atribut father dari anotherChildPerson. Hasilnya adalah bahawa newPerson menjadi bapa kepada anotherChildPerson dan anotherChildPerson menjadi seorang kanak-kanak newPerson.

 3. Lebih Mencecah

Model data permohonan sampel kami telah berkembang sedikit dari segi kerumitan. Kami telah mencipta hubungan satu-satu, satu-ke-banyak dan banyak-banyak. Kita telah melihat bagaimana mudah ianya untuk mencipta rekod, termasuk hubungan.  Jika kita juga mahukan supaya dapat menarik data dari kedai berterusan, maka kita perlu untuk mengetahui lebih lanjut mengenai mencecah. Mari kita mulakan dengan satu contoh mudah di mana kita melihat bagaimana untuk menyusun hasil yang dikembalikan oleh permintaan mencecah.

Penerang semacam

Untuk menyusun rekod-rekod yang kami kembali dari konteks objek diuruskan, kami menggunakan golongan NSSortDescriptor. Sila lihat pada cebisan kod berikut.

Kami memulakan permintaan mencecah dengan melawati dalam entiti yang kita berminat, Person. Kami kemudian mencipta objek NSSortDescriptor dengan menyeru init(key:ascending:), lulus dalam atribut bagi entiti-entiti yang kami ingin menyusun, first, dan boolean yang menunjukkan sama ada rekod-rekod tersebut perlu diasingkan dalam susunan menaik atau menurun.

Kami mengikat penerangan jenis permintaan mencecah dengan menetapkan hak milik sortDescriptors permintaan mencecah.  Kerana harta sortDescriptors jenis [NSSortDescriptor]?, ia adalah mungkin untuk menentukan lebih daripada satu jenis penerangan. Kita akan lihat pada opsyen ini dalam masa.

Seluruh blok kod sepatutnya kelihatan biasa. Permintaan mencecah diluluskan mengikut konteks diuruskan objek, yang melaksanakan permintaan mencecah apabila kita seru executeFetchRequest(_:). Ingat bahawa daerah kecil Engkilili merupakan satu kaedah throwing, yang bermaksud bahawa kita menggunakan kata kunci try dan melaksanakan permintaan mencecah dalam satu kenyataan do-catch.

Jalankan aplikasi dan memeriksa output dalam konsol di Xcode. Output perlu kelihatan serupa dengan apa yang ditunjukkan di bawah. Seperti yang anda lihat, rekod-rekod disusun mengikut nama pertama mereka.

Jika anda melihat pendua dalam output, maka pastikan memberi komen keluar kod kita menulis lebih awal untuk mencipta rekod-rekod tersebut. Setiap kali anda menjalankan permohonan, rekod-rekod yang sama dicipta, mengakibatkan rekod pendua.

Seperti yang saya sebutkan, ia adalah mungkin untuk menggabungkan pelbagai jenis Penerang. Mari kita menyusun rekod-rekod tersebut dengan nama lepas dan umur. Kami mula-mula menetapkan kekunci deskriptor jenis pertama untuk last. Kami kemudian membuat satu lagi jenis penerangan dengan kekunci age dan menambah kepada pelbagai jenis Penerang.

Hasil menunjukkan bahawa perintah Penerang semacam dalam pelbagai adalah penting. Rekod yang mula-mula disusun mengikut nama terakhir mereka dan kemudian mengikut usia mereka.

Predikat

Penerang semacam hebat dan mudah untuk digunakan, tetapi predicates adalah apa yang benar-benar membuatkan mencecah kuat dalam teras Data.  Penerang semacam memberitahu teras Data bagaimana rekod-rekod tersebut perlu diasingkan. Predicates memberitahu teras Data rekod apa yang anda minati. Kelas kami akan bekerja dengan yang NSPredicate.

Mari kita mulakan dengan mengambil setiap ahli dalam keluarga Doe. Ini adalah amat mudah untuk dilakukan dan sintaks akan mengingatkan ada di antara kamu daripada SQL.

Kita tidak berubah jauh di samping mencipta objek NSPredicate menyeru init(format:arguments:) dan mengikat predicate permintaan mencecah dengan menetapkan sifat yang predicate. Ambil perhatian bahawa kaedah init(format:arguments:) menerima sejumlah pembolehubah hujah.

Rentetan predicate format menggunakan %K nama sifat dan %@ nilai. Seperti yang dinyatakan di dalam panduan pengaturcaraan Predicate, %K adalah hujah variabel penggantian bagi laluan utama manakala %@ hujah variabel penggantian nilai objek untuk.  Ini bermakna bahawa rentetan predicate format contoh kita menilai untuk last == "Doe".

Jika anda menjalankan permohonan dan memeriksa output dalam konsol di Xcode, anda akan dapat melihat keputusan berikut:

Terdapat banyak pengendali yang kita boleh gunakan untuk perbandingan. Sebagai tambahan kepada = dan ==, yang seiras setakat teras Data berkenaan, Terdapat juga >= dan =>, <= dan =>!= dan <>, dan > dan <. Saya menggalakkan anda untuk bereksperimen dengan pengusaha ini untuk mengetahui berapa mereka menjejaskan keputusan atas permintaan mencecah.

Predicate yang berikut menggambarkan bagaimana kita boleh menggunakan dalam >= pengendali hanya mencecah rekod Person dengan atribut umur melebihi 30.

Kami juga mempunyai pengendali rentetan perbandingan, CONTAINS, LIKE, MATCHESBEGINSWITH dan ENDSWITH. Mari kita kutip setiap rekod Person yang namanya CONTAINS kata j.

Jika anda menjalankan permohonan, pelbagai keputusan akan kosong kerana perbandingan rentetan kes sensitif secara lalai. Kita boleh mengubah ini dengan menambah pengubahsuai yang seperti:

Anda juga boleh mencipta predicates majmuk yang menggunakan kata kunci AND, OR, dan NOT. Dalam contoh berikut, kita kutip tiap-tiap orang yang namanya pertama mengandungi j Surat dan lebih 30.

Predicates juga membuat ia sangat mudah untuk mendapatkan rekod berdasarkan hubungan mereka. Dalam contoh berikut, kita kutip tiap-tiap orang yang nama bapanya yang tidak sama dengan Bart.

Predicate di atas yang berfungsi seperti yang dijangka, kerana %K hujah variabel penggantian bagi laluan kunci, bukan hanya satu kekunci.

Apa yang anda perlu ingat adalah bahawa predicates membolehkan anda untuk pertanyaan pada storan simpanan tanpa anda mengetahui apa-apa tentang kedai.  Walaupun sintaks rentetan predicate format adalah mengingatkan kita tentang SQL dalam beberapa cara, ia tidak kira jika pada storan simpanan pangkalan data Auto_increment atau stor di ingatan.  Ini adalah satu konsep yang sangat kuat yang tidak unik kepada teras Data. Rails's Active Record adalah satu lagi contoh paradigma ini.

Terdapat banyak lagi yang boleh predicates daripada apa saya telah menunjukkan anda dalam artikel ini. Jika anda ingin mengetahui lebih lanjut tentang predicates, saya cadangkan anda mengambil puncak pada panduan pengaturcaraan Predicate Apple.  Kami akan juga berusaha lebih dengan predicates dalam tempoh beberapa rencana daripada siri ini.

Kesimpulan

Kini, anda mempunyai satu genggaman baik asas-asas teras Data dan Inilah masanya untuk mula bekerja dengan rangka kerja dengan mencipta aplikasi yang memanfaatkan kuasa teras Data.  Dalam artikel akan datang, kita bertemu lagi golongan penting rangka teras Data NSFetchedResultsController. Kelas ini akan membantu kami menguruskan koleksi rekod, tetapi anda akan mempelajari bahawa hal itu agak sedikit lebih daripada 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.