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

Inti Data dan Swift: dikelola objek dan mengambil permintaan

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Core Data and Swift.
Core Data and Swift: Data Model
Core Data and Swift: Relationships and More Fetching

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

Dengan segala sesuatu tentang Cora Data model data masih segar dalam pikiran Anda, saatnya untuk mulai bekerja dengan Data inti. Dalam artikel ini, kita bertemu NSManagedObject, kelas Anda akan berinteraksi dengan sebagian ketika bekerja dengan Data inti. Anda akan belajar cara membuat, baca, update, dan menghapus catatan.

Anda juga akan mendapatkan untuk mengetahui beberapa kelas inti Data lain, seperti NSFetchRequest dan NSEntityDescription. Mari saya mulai dengan memperkenalkan Anda kepada NSManagedObject, teman terbaik baru.

Prasyarat

Apa yang saya membahas dalam seri ini pada inti Data ini berlaku untuk iOS 7 + dan OS X 10.10+, tetapi akan fokus pada iOS. Dalam seri ini, saya akan bekerja dengan Xcode 7,1 dan Swift 2.1. Jika Anda memilih Objective-C, maka saya menyarankan membaca seri sebelumnya kerangka Data inti.

1. dikelola objek

Contoh NSManagedObject mewakili sebuah record di inti Data dukungan toko. Ingat, tidak peduli apa toko dukungan yang tampak seperti. Namun, untuk meninjau kembali analogi database, NSManagedObject instance berisi informasi baris dalam tabel database.

Alasan Data inti menggunakan NSManagedObject bukan NSObject sebagai kelas dasar untuk pemodelan catatan akan lebih masuk akal sedikit kemudian. Sebelum kita mulai bekerja dengan NSManagedObject, kita perlu tahu beberapa hal tentang kelas ini.

NSEntityDescription

Setiap contoh NSManagedObject ini dikaitkan dengan instance dari NSEntityDescription. Deskripsi badan berisi informasi tentang obyek dikelola, seperti entitas dikelola objek serta ciri-ciri dan hubungan.

NSManagedObjectContext

Sebuah objek yang dikelola juga dikaitkan dengan instance dari NSManagedObjectContext. Konteks dikelola objek yang mana objek dikelola berasal, memonitor objek dikelola untuk perubahan.

2. membuat Record

Dengan di atas dalam pikiran, menciptakan sebuah objek yang dikelola cukup sederhana. Untuk memastikan sebuah objek yang dikelola dikonfigurasi dengan benar, disarankan untuk menggunakan initializer Ruangan Khusus untuk menciptakan baru NSManagedObject kasus. Mari kita lihat bagaimana ini bekerja dengan menciptakan objek orang baru.

Buka proyek dari artikel sebelumnya atau clone repositori dari GitHub. Karena kita tidak akan membangun sebuah aplikasi fungsional dalam artikel ini, kami akan melakukan sebagian besar pekerjaan kami di kelas delegasi aplikasi, AppDelegate. Buka AppDelegate.swift dan memperbarui pelaksanaan application(_:didFinishLaunchingWithOptions:) seperti yang ditunjukkan di bawah ini.

Hal pertama yang kita lakukan, adalah menciptakan instance kelas NSEntityDescription dengan menerapkan entityForName(_:inManagedObjectContext:). Kami melewati nama entitas yang kita ingin membuat sebuah objek yang dikelola untuk, "Orang", dan NSManagedObjectContext instance.

Mengapa kita harus melewati sebuah objek NSManagedObjectContext? Kita menetapkan nama yang kami ingin menciptakan sebuah objek yang dikelola untuk, tetapi kita juga perlu memberitahu Data inti di mana ia dapat menemukan data model untuk entitas tersebut. Ingat bahwa konteks dikelola objek yang terikat kepada Koordinator toko terus-menerus dan gigih toko Koordinator membuat referensi ke data model. Ketika kami melewati dalam konteks dikelola objek, Data inti meminta koordinatornya gigih toko untuk model datanya untuk mencari entitas yang kita cari.

Pada langkah kedua, kita memanggil initializer ditunjuk kelas NSManagedObject, init(entity:insertIntoManagedObjectContext:). Kita lulus dalam deskripsi badan dan NSManagedObjectContext instance. Tunggu? Mengapa kita perlu lulus dalam contoh NSManagedObjectContext lain? Ingat apa yang saya tulis sebelumnya. Sebuah objek yang dikelola dikaitkan dengan deskripsi badan dan hidup dalam konteks dikelola objek, itulah sebabnya mengapa kita mengatakan Data inti konteks dikelola objek yang dikelola objek baru harus terhubung ke.

Ini tidak terlalu rumit. Itu? Kami sekarang telah membuat objek orang baru. Bagaimana kita mengubah sifat atau mendefinisikan sebuah hubungan? Hal ini dilakukan dengan memanfaatkan coding kunci-nilai. Untuk mengubah nama objek orang baru yang kami hanya dibuat kita lakukan yang berikut:

Jika Anda akrab dengan coding kunci-nilai, maka ini harus terlihat sangat akrab. Karena kelas NSManagedObject sesuai dengan protokol NSKeyValueCoding, kami menetapkan atribut dengan menerapkan setValue(_:forKey:). Ini yang sederhana.

Salah satu kelemahan dari pendekatan ini adalah bahwa Anda dapat dengan mudah memperkenalkan bug dengan salah mengeja nama atribut atau hubungan. Juga, nama atribut yang tidak autocompleted oleh Xcode seperti, misalnya, nama properti. Mudah untuk memecahkan masalah ini, tapi itu adalah sesuatu yang kita akan mengambil melihat sedikit kemudian dalam seri ini.

Sebelum kita melanjutkan eksplorasi NSManagedObject, mari kita menetapkan atribut umur newPerson untuk 44.

3. menyimpan catatan

Meskipun kami sekarang memiliki sebuah instance orang baru, inti Data belum disimpan orang ke toko dukungan yang belum. Saat ini, dikelola objek kami menciptakan hanya hidup dalam konteks dikelola objek di mana ia telah dimasukkan. Untuk menyimpan objek orang toko dukungan, kita perlu menyimpan perubahan konteks dikelola objek dengan memanggil save() di atasnya.

Save() method adalah metode melempar dan mengembalikan boolean untuk menunjukkan hasil Simpan operasi. Lihatlah blok kode berikut untuk klarifikasi.

Membangun dan menjalankan aplikasi untuk melihat apakah semuanya bekerja seperti yang diharapkan. Apakah Anda juga menjalankan menjadi crash? Apa yang menurut konsol output memberitahu Anda? Apakah terlihat mirip dengan output di bawah ini?

Xcode memberitahu kita bahwa itu diharapkan instance NSDate untuk atribut pertama, tetapi kami melewati dalam String. Jika Anda membuka model Data inti yang kami ciptakan dalam artikel sebelumnya, Anda akan melihat bahwa jenis atribut pertama memang tanggal. Mengubahnya ke String dan menjalankan aplikasi satu kali lagi.

Lain kecelakaan? Meskipun ini adalah topik yang lebih maju, penting untuk memahami apa yang sedang terjadi.

Data Model kompatibilitas

Output di Xcode di konsol akan terlihat mirip dengan output yang ditunjukkan di bawah ini. Perhatikan bahwa kesalahan yang berbeda dari yang sebelumnya. Xcode memberitahu kita bahwa model untuk membuka toko tidak sesuai dengan yang digunakan untuk membuat toko. Bagaimana ini terjadi?

Ketika kami pertama kali diluncurkan aplikasi beberapa saat yang lalu, Data inti memeriksa data model dan, berdasarkan model, menciptakan sebuah toko untuk kita, SQLite database dalam kasus ini. Data inti cerdas sekalipun. Memastikan bahwa struktur toko dukungan dan bahwa data model yang kompatibel. Hal ini penting untuk memastikan bahwa kami kembali dari toko dukungan apa yang kita harapkan dan apa yang kita masukkan sana di tempat pertama.

Selama kecelakaan pertama, kita melihat bahwa model data kami berisi kesalahan dan kami mengubah jenis atribut pertama dari tanggal ke String. Dengan kata lain, kami mengubah data model meskipun Data inti sudah ciptakan toko dukungan bagi kami berdasarkan model data yang tidak tepat.

Setelah memperbarui data model, kami meluncurkan aplikasi lagi dan berlari ke dalam kecelakaan kedua. Salah satu hal inti Data tidak ketika ia menciptakan tumpukan Data inti adalah memastikan data model dan dukungan menyimpan — jika ada — kompatibel. Bahwa itu tidak terjadi dalam contoh kita maka kecelakaan.

Bagaimana kita menyelesaikan ini? Solusi yang mudah adalah untuk menghapus aplikasi dari perangkat atau dari simulator, dan meluncurkan aplikasi lagi. Namun, ini adalah sesuatu yang tidak dapat Anda lakukan jika Anda sudah memiliki sebuah aplikasi di App Store yang orang yang menggunakan. Dalam hal ini, Anda membuat penggunaan migrasi, yang merupakan sesuatu yang kita akan bahas dalam artikel yang akan datang.

Karena kita tidak memiliki jutaan pengguna yang menggunakan aplikasi kami, kita dapat dengan aman menghapus aplikasi dari perangkat uji kami dan menjalankannya lagi. Jika semua berjalan baik, orang yang baru sekarang disimpan dengan aman di toko, database SQLite Data inti ciptakan untuk kita.

Memeriksa toko dukungan

Anda dapat memverifikasi bahwa menyimpan operasi bekerja dengan melihat di dalam SQLite database. Jika Anda menjalankan aplikasi dalam simulator, kemudian arahkan ke /Users/<USER>/Perpustakaan/pengembang/CoreSimulator/perangkat/<DEVICE_ID>/data/wadah/Data/aplikasi/<APPLICATION_ID>/Documents/SingleViewCoreData.sqlite.</APPLICATION_ID> </DEVICE_ID> </USER> Karena lokasi perubahan data aplikasi dengan setiap rilis Xcode, path diatas ini hanya berlaku untuk Xcode 7.

Buka SQLite database dan memeriksa tabel yang bernama ZPERSON. Tabel harus memiliki satu record, yang kita dimasukkan satu menit yang lalu.

Contents of the SQLite Database

Anda harus menyimpan dua hal dalam pikiran. Pertama, ada tidak perlu untuk memahami struktur database. Data inti mengelola toko dukungan bagi kita dan kita tidak perlu memahami struktur untuk bekerja dengan Data inti. Kedua, tidak pernah mengakses toko dukungan secara langsung. Data inti adalah bertanggung jawab atas toko dukungan dan kita perlu menghormati hal itu jika kita ingin Data inti untuk melakukan tugasnya dengan baik. Jika kita mulai berinteraksi dengan SQLite database — atau jenis toko lain — tidak ada jaminan Data inti akan terus berfungsi dengan baik. Singkatnya, Data inti adalah bertanggung jawab atas toko jadi meninggalkannya sendirian.

4. mengambil catatan

Meskipun kita akan mengambil melihat dari dekat NSFetchRequest dalam artikel berikutnya, kita perlu NSFetchRequest kelas untuk meminta informasi dari grafik objek mengelola Data inti. Mari kita lihat bagaimana kita dapat mengambil catatan kami dimasukkan sebelumnya menggunakan NSFetchRequest.

Setelah inisialisasi fetch permintaan, kami menciptakan sebuah objek NSEntityDescription dan menetapkannya ke properti entitas permintaan fetch. Seperti yang Anda lihat, kita menggunakan NSEntityDescription kelas untuk memberitahu Data inti apa entitas yang kami tertarik.

Pengambilan data ditangani oleh golongan NSManagedObjectContext. Kita memanggil executeFetchRequest(_:), melewati dalam mengambil permintaan. Karena executeFetchRequest(_:) merupakan metode melempar, kami membungkus panggilan metode dalam sebuah pernyataan do-menangkap.

Metode tersebut mengembalikan array dari hasil jika permintaan fetch sukses. Catatan bahwa inti Data selalu mengembalikan array jika permintaan fetch berhasil, bahkan jika kita mengharapkan satu hasil atau jika Data inti tidak menemukan catatan yang cocok.

Jalankan aplikasi dan memeriksa output di Xcode di konsol. Di bawah ini Anda dapat melihat apa kembali, sebuah array dengan satu objek jenis NSManagedObject. Objek adalah orang.

Untuk mengakses atribut dari catatan, kami membuat menggunakan coding kunci-nilai seperti kita lakukan sebelumnya. Hal ini penting untuk menjadi akrab dengan coding kunci-nilai jika Anda berencana untuk bekerja dengan Data inti.

Anda mungkin bertanya-tanya mengapa saya login objek orang sebelum dan setelah login nama orang. Ini sebenarnya adalah salah satu pelajaran yang paling penting dari artikel ini. Melihat output di bawah ini.

Pertama kalinya kami log objek orang ke konsol, kita melihat data: <fault>.</fault> Kedua kalinya, namun, data berisi isi dari atribut objek dan hubungan. Kenapa bisa begitu? Ini memiliki segala sesuatu yang berkaitan dengan patahan, konsep kunci dari Data inti.

5. patahan

Konsep yang mendasari patahan tidak unik ke inti Data. Jika Anda sudah pernah bekerja dengan Active Record di Ruby on Rails, maka berikut akan pasti membunyikan lonceng. Konsep tidak identik, tetapi serupa dari seorang pengembang sudut pandang.

Data inti mencoba untuk menjaga jejak memori serendah mungkin dan salah satu strategi menggunakan untuk mencapai hal ini adalah patahan. Ketika kami diambil catatan untuk entitas orang beberapa saat yang lalu, Data inti dilaksanakan mengambil permintaan, tetapi itu tidak sepenuhnya menginisialisasi objek dikelola mewakili catatan terlalu.

Apa yang kami kembali adalah suatu kesalahan, sebuah objek pengganti yang mewakili catatan. Objek adalah jenis NSManagedObject dan kami dapat memperlakukannya seperti itu. Oleh tidak sepenuhnya initializing catatan, Data inti membuat jejak memori rendah. Ianya tidak signifikan memori menyimpan dalam contoh kita, tapi membayangkan apa yang akan terjadi jika kami diambil puluhan, ratusan atau bahkan ribuan catatan.

Kesalahan yang umumnya tidak bahwa Anda perlu khawatir tentang. Saat Anda mengakses atribut atau hubungan benda yang dikelola, kesalahan dipecat, yang berarti bahwa Data inti perubahan kesalahan ke objek dikelola menyadari. Anda dapat melihat ini dalam contoh kita dan itulah juga alasannya mengapa pernyataan log kedua objek orang tidak mencetak kesalahan untuk konsol.

Patahan adalah sesuatu yang perjalanan naik banyak pendatang baru dan karena itu saya ingin memastikan bahwa Anda memahami dasar-dasar konsep ini. Kita akan mempelajari lebih lanjut tentang patahan nanti dalam seri ini. Jika Anda ingin mempelajari lebih lanjut tentang kesalahan Data inti, maka Anda mungkin ingin untuk membaca ini mendalam melihat patahan inti data.

6. memperbarui catatan

Memperbarui catatan sama seperti sederhana seperti menciptakan rekor baru. Anda mengambil catatan, mengubah atribut atau hubungan, dan menyimpan konteks dikelola objek. Karena dikelola objek, catatan, terkait dengan konteks dikelola objek, yang kedua menyadari perubahan, Insersi, update, dan menghapus. Ketika konteks dikelola objek disimpan, semuanya adalah diterapkan ke toko dukungan oleh inti Data.

Lihatlah blok kode berikut di mana kami memperbarui catatan kami diambil dengan mengubah orang usia dan menyimpan perubahan.

Anda dapat memverifikasi bahwa update telah berhasil dengan mengambil melihat toko SQLite seperti kita lakukan sebelumnya.

Updating a Record in the Backing Store

7. menghapus catatan

Menghapus catatan mengikuti pola yang sama. Kita mengatakan konteks dikelola objek yang catatan yang perlu dihapus dari toko terus-menerus dengan menerapkan deleteObject(_:) dan lewat obyek dikelola yang perlu dihapus.

Proyek kami, menghapus objek orang kami diambil sebelumnya oleh lewat ke konteks dikelola objek deleteObject(_:) metode. Perhatikan bahwa menghapus operasi tidak berkomitmen untuk toko dukungan sampai kita memanggil save() pada konteks dikelola objek.

Anda dapat memverifikasi bahwa Hapus operasi telah berhasil dengan mengambil melihat toko SQLite.

Deleting a Record from the Backing Store

Kesimpulan

Dalam tutorial ini, kita telah membahas banyak lebih dari sekadar membuat, mengambil, memperbarui, dan menghapus catatan. Kami telah menyentuh tentang beberapa konsep penting di mana Data inti bergantung, seperti patahan dan data model kompatibilitas.

Angsuran berikutnya dari seri ini, Anda akan belajar bagaimana untuk membuat dan memperbarui hubungan, dan kita mengambil pandangan mendalam mengenai kelas NSFetchRequest. Kami juga akan mulai menggunakan NSPredicate dan NSSortDescriptor untuk membuat permintaan menjemput kami fleksibel, dinamis dan kuat.

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.