Inti Data dari awal: Core tumpukan Data
Indonesian (Bahasa Indonesia) translation by Ibnukholil (you can also view the original English article)
Introduksi
Kerangka Inti Data telah ada selama bertahun-tahun. Ini digunakan dalam ribuan aplikasi dan oleh jutaan orang, baik di iOS dan OS X. Core Data dikelola oleh Apple dan didokumentasikan dengan sangat baik. Ini adalah kerangka kerja matang yang telah membuktikan nilainya berulang-ulang.
Data Inti mengambil keuntungan dari bahasa Objective-C dan runtime, dan terintegrasi dengan rapi dengan kerangka Core Foundation. Hasilnya adalah kerangka kerja yang mudah digunakan untuk mengelola grafik objek yang elegan untuk digunakan dan sangat efisien dalam hal penggunaan memori.
1. Prasyarat
Meskipun kerangka Core Data tidak begitu sulit, jika Anda baru di iOS atau pengembangan OS X, maka saya sarankan Anda terlebih dahulu melalui seri kami tentang pengembangan iOS. Ini mengajarkan Anda dasar-dasar pengembangan iOS dan, pada akhir seri, Anda akan memiliki cukup pengetahuan untuk mengambil topik yang lebih kompleks, seperti Data Inti.
Seperti yang saya katakan, Data Inti tidak serumit atau sulit untuk diambil karena sebagian besar pengembang berpikir. Namun, saya telah belajar bahwa fondasi yang kuat sangat penting untuk mendapatkan kecepatan dengan Core Data. Anda harus memiliki pemahaman yang tepat tentang API Data Inti untuk menghindari praktik buruk dan pastikan Anda tidak mengalami masalah menggunakan kerangka kerja.
Setiap komponen kerangka Data Inti memiliki tujuan dan fungsi tertentu. Jika Anda mencoba menggunakan Data Inti dengan cara yang tidak dirancang untuknya, Anda pasti akan berakhir dengan berjuang dengan kerangka.
Apa yang saya bahas dalam seri ini pada Core Data berlaku untuk iOS 6 dan OS X 10.8, tetapi fokusnya adalah pada iOS. Dalam seri ini, saya akan bekerja dengan Xcode 5 dan iOS 7 SDK.
2. Belajar Kurva
Framework Inti Data dapat tampak menakutkan pada awalnya, tetapi API intuitif dan ringkas setelah Anda memahami bagaimana berbagai potongan puzzle cocok bersama. Dan itulah di mana sebagian besar pengembang mengalami masalah. Mereka mencoba menggunakan Data Inti sebelum mereka melihat proverbial puzzle itu, mereka tidak tahu bagaimana potongan-potongan puzzle cocok dan terhubung satu sama lain.
Dalam artikel ini, saya akan membantu Anda menjadi akrab dengan apa yang disebut Core Data stack. Setelah Anda memahami kunci pemain dari tumpukan Data Inti, framework akan terasa kurang menakutkan dan Anda bahkan akan mulai menikmati dan menghargai kerangka API yang dibuat dengan baik.
Berbeda dengan kerangka kerja seperti UIKit, yang dapat Anda gunakan tanpa memahami kerangka kerja secara keseluruhan, Core Data menuntut pemahaman yang tepat tentang blok pembangunnya. Sangat penting untuk menyisihkan waktu untuk menjadi akrab dengan kerangka kerja, yang akan kami lakukan dalam tutorial ini.
3. Apa itu Core Data?
Developer yang baru dalam framework Core Data sering mengacaukannya dan mengharapkannya berfungsi sebagai database. Jika ada satu hal saya harap Anda ingat dari seri ini, itu adalah bahwa Core Data bukan database dan Anda seharusnya tidak berharap untuk bertindak seperti itu.
Apa itu Core Data jika bukan database? Core Data adalah lapisan model aplikasi Anda dalam arti seluas mungkin. Ini Model dalam pola Model-View-Controller menembus iOS SDK.
Core Data bukanlah database dari aplikasi Anda, juga bukan API untuk meneruskan data ke database. Core Data adalah framework yang mengelola grafik objek. Sesederhana itu. Core Data dapat bertahan bahwa objek grafik dengan menulisnya ke disk, tetapi itu bukan tujuan utama dari framework.
4. Tumpukan Core Data
Seperti yang saya sebutkan sebelumnya, tumpukan Core Data adalah inti dari Core Data. Ini adalah kumpulan objek yang membuat Core Data dicentang. Objek utama dari stack adalah model objek yang dikelola, persistent store coordinator, dan satu atau lebih konteks objek yang dikelola. Mari kita mulai dengan melihat sekilas setiap komponen.
NSManagedObjectModel
Model objek yang dikelola adalah model data aplikasi. Meskipun Core Data bukan database, Anda dapat membandingkan model objek yang dikelola dengan skema database, yang berisi informasi tentang model atau entitas grafik objek, atribut apa yang mereka miliki, dan bagaimana mereka berhubungan dengan satu sama lain.
Objek NSManagedObjectModel
tahu tentang model data dengan memuat satu atau lebih file model data selama inisialisasi. Kami akan melihat cara kerjanya dalam beberapa saat.
NSPersistentStoreCoordinator
Seperti namanya menunjukkan, objek NSPersistentStoreCoordinator
mempertahankan data ke disk dan memastikan penyimpanan persisten (s) dan model data yang kompatibel. Ini memediasi antara persistent store(s) dan managed object context(s) dan juga mengurus pemuatan dan caching data. Itu Benar. Core Data memiliki cache yang tertanam di dalamnya.
Koordinator persistent store adalah konduktor Core Data orchestra. Terlepas dari peran pentingnya dalam tumpukan Core Data, kami jarang berinteraksi dengannya secara langsung.
NSManagedObjectContext
Objek NSManagedObjectContext
mengelola koleksi dari objek model, contoh class NSManagedObject
. Sangat mungkin untuk memiliki beberapa konteks objek yang dikelola. Setiap konteks objek yang dikelola didukung oleh koordinator persistent store .
Anda dapat melihat konteks objek yang dikelola sebagai meja kerja tempat Anda bekerja dengan objek model Anda. Anda memuatnya, Anda memanipulasinya, dan menyimpannya di meja kerja itu. Pemuatan dan penyimpanan dimediasi oleh koordinator persistent store . Anda dapat memiliki beberapa meja kerja, yang berguna jika aplikasi Anda multithread, misalnya.
Meskipun model objek yang dikelola dan koordinator persistent store dapat dibagikan di seluruh untaian, konteks objek terkelola tidak boleh diakses dari utas yang berbeda dari yang dibuat. Kita akan membahas multithreading secara lebih rinci nanti dalam seri ini.
5. Menjelajahi Stack Core Data
Langkah 1: Template Xcode
Mari kita telusuri tumpukan Core Data secara lebih terperinci dengan melihat pada template Xcode Apple untuk Core Data. Buat proyek baru di Xcode 5 dengan memilih New > Project... dari menu File. Pilih template Aplikasi Kosong dari daftar templat Aplikasi iOS di sebelah kiri.



Beri nama Proyek Core Data, atur Perangkat ke iPhone, dan centang kotak centang berlabel Use Core Data. Beri tahu Xcode tempat Anda ingin menyimpan file proyek dan tekan Buat.



Langkah 2: Overview
Secara default, Apple menempatkan kode yang terkait dengan Core Data di kelas delegasi aplikasi, class TSPAppDelegate
dalam contoh kami. Mari kita mulai dengan menjelajahi antarmuka TSPAppDelegate
.
#import <UIKit/UIKit.h> @interface TSPAppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; - (void)saveContext; - (NSURL *)applicationDocumentsDirectory; @end
Seperti yang Anda lihat, delegasi aplikasi memiliki properti untuk setiap komponen tumpukan Core Data serta dua metode kenyamanan, saveContext
dan applicationDocumentsDirectory
.
Perhatikan bahwa properti Core Data ditandai sebagai readonly
, yang berarti bahwa instance tidak dapat dimodifikasi oleh objek selain dari aplikasi delegasi itu sendiri.
Implementasi TSPAppDelegate
jauh lebih menarik dan akan menunjukkan kepada kita bagaimana model objek yang dikelola, koordinator persistent store, dan konteks objek yang dikelola bekerja bersama. Mari mulai dari atas.
#import "TSPAppDelegate.h" @implementation TSPAppDelegate @synthesize managedObjectContext = _managedObjectContext; @synthesize managedObjectModel = _managedObjectModel; @synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
Karena properti di interface dari class TSPAppDelegate
dinyatakan sebagai readonly, tidak ada method penyetel yang dibuat. Pertama @synthesize
memberitahu secara direktif menyusun untuk mengaitkan variabel instan _managedObjectContext
dengan properti managedObjectContext
yang kami nyatakan dalam interface dari classnya. Ini adalah pola umum untuk memuat objek secara malas.
Anda dapat mencapai hasil yang sama dengan menggunakan ekstensi class private di file implementasi class. Lihatlah potongan kode berikut. Arah @synthesize
tidak diperlukan jika Anda menggunakan ekstensi class private.
#import "TSPAppDelegate.h" @interface TSPAppDelegate () @property (strong, nonatomic) NSManagedObjectContext *managedObjectContext; @property (strong, nonatomic) NSManagedObjectModel *managedObjectModel; @property (strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; @end
Meskipun saya biasanya menggunakan dan lebih suka ekstensi class private, kami akan tetap menggunakan template Apple untuk tutorial ini.
Menyiapkan stack Core Data sebenarnya cukup mudah dalam hal metode yang perlu diterapkan. Apple tidak menggunakan metode pengaturan khusus untuk membuat Stack Core Data. Tiga objek kunci dari stack Core Data dibuat ketika dibutuhkan. Dengan kata lain, mereka malas dimuat atau dipakai.
Dalam prakteknya ini berarti bahwa, implementasi class TSPAppDelegate
terlihat mirip dengan apa yang Anda harapkan dalam class delegasi aplikasi dengan pengecualian method saveContext
dan applicationDocumentsDirectory
, dan method pengambil dari managedObjectContext
, managedObjectModel
, dan persistentStoreCoordinator
. Ada dalam method pengambil ini bahwa keajaiban terjadi. Itulah salah satu keindahan dari Core Data, pengaturannya sangat sederhana dan berinteraksi dengan Core Data juga mudah.
Langkah 3: Konteks Objek yang Dikelola
Class yang paling sering Anda gunakan, selain dari NSManagedObject
, ketika berinteraksi dengan Core Data adalah NSManagedObjectContext
. Mari kita mulai dengan mengeksplorasi getternya.
- (NSManagedObjectContext *)managedObjectContext { if (_managedObjectContext != nil) { return _managedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; if (coordinator != nil) { _managedObjectContext = [[NSManagedObjectContext alloc] init]; [_managedObjectContext setPersistentStoreCoordinator:coordinator]; } return _managedObjectContext; }
Tiga baris pertama dari penerapannya adalah khas untuk getter yang dengan malas memuat variabel instan. Jika objek NSManagedObjectContext
tidak nil
, ia mengembalikan objek. Yang menarik adalah instantiasi sebenarnya dari objek NSManagedObjectContext
.
Kami pertama mengambil referensi ke koordinator persistence store dengan memanggil method pengambilnya. Koordinator persistent store juga malas dimuat seperti yang akan kita lihat nanti. Jika koordinator persistent store tidak nil
, kami membuat instance NSManagedObjectContext
dan menyetel properti persistentStoreCoordinator
nya ke koordinator persistent store. Itu tidak terlalu sulit. Apakah itu?
Singkatnya, Pengelola konteks objek yang mengelola kumpulan objek model, contoh class NSManagedObject
, dan menyimpan referensi ke koordinator persistent store. Ingatlah hal ini sambil membaca sisa artikel ini.
Langkah 4: Persistent Store Coordinator
Seperti yang kita lihat beberapa saat yang lalu, method persistentStoreCoordinator
dipanggil oleh method managedObjectContext
. Lihatlah penerapan persistentStoreCoordinator
, tetapi jangan biarkan hal itu membuat Anda takut. Sebenarnya tidak terlalu rumit.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (_persistentStoreCoordinator != nil) { return _persistentStoreCoordinator; } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Core_Data.sqlite"]; NSError *error = nil; _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { /* Replace this implementation with code to handle the error appropriately. abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. Typical reasons for an error here include: * The persistent store is not accessible; * The schema for the persistent store is incompatible with current managed object model. Check the error message to determine what the actual problem was. If the persistent store is not accessible, there is typically something wrong with the file path. Often, a file URL is pointing into the application's resources directory instead of a writeable directory. If you encounter schema incompatibility errors during development, you can reduce their frequency by: * Simply deleting the existing store: [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil] * Performing automatic lightweight migration by passing the following dictionary as the options parameter: @{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details. */ NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } return _persistentStoreCoordinator; }
Anda hampir selalu ingin menyimpan grafik objek Core Data ke disk dan Xcode template Apple menggunakan database SQLite untuk mencapai hal ini.
Ketika kami membuat koordinator persistent store di persistentStoreCoordinator
, kami menentukan lokasi store di disk. Kami mulai dengan membuat objek NSURL
yang mengarah ke lokasi tersebut di aplikasi sandbox. Kami memanggil applicationDocumentsDirectory
, method helper, yang mengembalikan lokasi, objek NSURL
, dari direktori Dokumen di aplikasi sandbox. Kami menambahkan Core_Data.sqlite
ke lokasi dan menyimpannya di storeURL
untuk digunakan nanti.
Secara default, nama store di disk sama dengan nama dari proyek. Anda dapat mengubahnya ke apapun yang Anda inginkan.
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Core_Data.sqlite"];
Seperti yang saya sebutkan beberapa saat yang lalu, ekstensi .sqlite
mengisyaratkan bahwa penyimpanan pada disk adalah basis data SQLite. Meskipun Core Data mendukung beberapa jenis store, SQLite adalah jenis store yang paling banyak digunakan karena kecepatan dan keandalannya.
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
Pada langkah berikutnya, kita instantiate koordinator persistent store dengan memohon initWithManagedObjectModel
: dan melewati contoh NSManagedObjectModel
. Kami mengambil referensi ke model objek yang dikelola dengan menerapkan method managedObjectModel
, yang akan kita bahas selanjutnya.
Kami sekarang memiliki instance dari class NSPersistentStoreCoordinator
, tetapi belum ada store yang terkait dengannya. Kami menambahkan toko ke koordinator toko persisten dengan memanggil method yang cukup mengesankan di atasnya, addPersistentStoreWithType:configuration:URL:options:error
.
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { }
Argumen pertama menentukan jenis store, NSSQLiteStoreType
dalam contoh ini. Core Data juga mendukung binary store (NSBinaryStoreType
) dan memory store (NSInMemoryStoreType
).
Argumen kedua memberitahu Core Data konfigurasi mana yang digunakan untuk penyimpanan persisten. Kami lulus nil
, yang memberitahu Core Data untuk menggunakan konfigurasi default. Argumen ketiga adalah lokasi store, yang disimpan di storeURL
.
Argumen keempat adalah NSDictionary
dari pilihan yang memungkinkan kita mengubah perilaku persisten store. Kami akan meninjau kembali aspek ini nanti dalam seri ini dan lulus dengan nil
untuk saat ini. Argumen terakhir adalah referensi ke pointer NSError
.
Jika tidak ada kesalahan muncul, method ini mengembalikan objek NSPersistentStore
. Kami tidak menyimpan referensi ke toko persisten, karena kami tidak perlu berinteraksi dengannya setelah ditambahkan ke koordinator persistent store.
Jika menambahkan penyimpanan persisten store gagal, itu berarti ada masalah dengan penyimpanan aplikasi yang terus-menerus dan kita perlu mengambil langkah yang diperlukan untuk menyelesaikan masalah. Ketika ini terjadi dan mengapa itu terjadi adalah subjek dari angsuran masa depan.
Saat ini, abort
dipanggil saat addPersistentStoreWithType:configuration: URL:option:error:
mengembalikan nil
. Seperti komentar dalam pernyataan if
yang menjelaskan, Anda seharusnya tidak pernah abort
panggilan di lingkungan produksi, karena aplikasi macet. Kami akan memperbaikinya nanti di seri ini.
Langkah 5: Managed Object Model
Bagian ketiga dan terakhir dari puzzle adalah managed object model. Mari kita lihat pengambil properti managedObjectModel
.
- (NSManagedObjectModel *)managedObjectModel { if (_managedObjectModel != nil) { return _managedObjectModel; } NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Core_Data" withExtension:@"momd"]; _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]; return _managedObjectModel; }
Implementasinya sangat mudah. Kami menyimpan lokasi model aplikasi di modelURL
dan meneruskan modelURL
ke initWithContentsOfURL:
untuk membuat instance dari class NSManagedObjectModel
.
Pada titik ini, Anda mungkin bertanya-tanya model apa yang modelURL
tunjuk dan apa file dengan ekstensi .momd
. Untuk menjawab pertanyaan-pertanyaan ini, kita perlu mencari tahu apa lagi yang dibuat Xcode untuk kita selama pengaturan proyek.
Di Navigator Proyek di sebelah kiri, Anda akan melihat file bernama Core_Data.xcdatamodeld. Ini adalah model data dari aplikasi yang dikompilasi ke file .momd
. Itu adalah file .momd
yang digunakan oleh model objek yang dikelola untuk membuat model data aplikasi.



Dimungkinkan untuk memiliki beberapa file model data. Class NSManagedObjectModel
sangat mampu menggabungkan beberapa model data menjadi satu, yang merupakan salah satu fitur yang lebih kuat dan canggih dari Core Data.
Framework Core Data juga mendukung versi model data serta migrasi. Ini memastikan bahwa data yang disimpan di persisten store(s) tidak rusak. Kami akan membahas versi dan migrasi nanti dalam seri ini.
File model data dalam proyek kami kosong saat ini, yang berarti bahwa model data kami tidak mengandung entitas. Kami akan memperbaikinya dalam tutorial berikutnya yang akan memfokuskan secara eksklusif pada model data.
6. Putting It All Together
Sebelum kita menyelesaikan artikel ini, saya ingin menunjukkan kepada Anda diagram yang mengilustrasikan tiga komponen tumpukan Core Data.



Diagram di atas adalah representasi visual dari apa yang kita dieksplorasi dalam template Xcode beberapa saat yang lalu. Objek NSPersistentStoreCoordinator
adalah otak dari tumpukan Core Data dari aplikasi. Ini berbicara ke satu atau lebih toko yang terus-menerus dan memastikan data disimpan, dimuat, dan disimpan dalam cache.
Koordinator persistent store mengetahui tentang model data, skema grafik objek jika Anda suka, melalui objek NSManagedObjectModel
. Model objek yang dikelola menciptakan model data aplikasi dari satu atau lebih file .momd
, representasi biner dari model data.
Terakhir tapi bukan yang akhir, aplikasi mengakses grafik objek melalui satu atau lebih instance dari class NSManagedObjectContext
. Konteks objek yang dikelola tahu tentang model data melalui koordinator persisten store, tetapi tidak tahu atau menyimpan referensi ke model objek yang dikelola. Tidak perlu koneksi itu.
Konteks objek yang dikelola meminta koordinator terus-menerus untuk data dan memberitahukannya untuk menyimpan data bila diperlukan. Konteks objek yang dikelola meminta koordinator terus-menerus untuk data dan memberitahukannya untuk menyimpan data bila diperlukan.
Kesimpulan
Dalam artikel ini, kami membahas pemain kunci dari tumpukan Core Data, koordinator persisten store, model objek yang dikelola, dan konteks objek yang dikelola. Pastikan Anda memahami peran masing-masing komponen dan, yang lebih penting, bagaimana mereka bekerja sama untuk membuat Core Data melakukan keajaibannya.
Dalam rangkaian berikutnya dari seri ini di Core Data, kami akan mendalami ke dalam model data. Kami melihat pada editor model data di Xcode 5 dan kami membuat beberapa entitas, atribut, dan hubungan.
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weekly