本文需要具備一定的core data基礎。
如,建立project,選擇Master-Detail Application類型的模版
命名為MasterCoreData,勾選Use Core Data和Use Automatic Reference Counting
在模擬器上試運行此工程,結果如下:
點擊右上方的添加按鈕,結果如下:
再次點擊右上方的添加按鈕,結果如下:
點擊左上方編輯按鈕,進入刪除編輯模式,如:
試一試其他動作,沒有崩潰產生,啊,原來xcode已經為我們實現了這麼多!
接下來,我們就去看一看到底xcode為我們自動添加了哪些代碼,這些代碼之間的調用關係是什麼。let`s go!
工程目錄下多出一個名為MasterCoreData.xcdatamodeld的檔案,
點擊右下角Editor Style,轉換為另一種顯示方式,如:
AppDelegate.h中比普通的情況下多出了下列代碼:
@property (readonly,
strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (readonly,
strong, nonatomic) NSManagedObjectModel *managedObjectModel;
@property (readonly,
strong, nonatomic)
NSPersistentStoreCoordinator *persistentStoreCoordinator;
- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
AppDelegate.m中比普通的情況下多出了下列代碼:
- (void)saveContext
{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext =
self.managedObjectContext;
if (managedObjectContext !=
nil) {
if ([managedObjectContext
hasChanges] && ![managedObjectContext save:&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.
NSLog(@"Unresolved error %@, %@", error, [error
userInfo]);
abort();
}
}
}
#pragma mark - Core Data stack
// Returns the managed object context for the application.
// If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext !=
nil) {
return
_managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self
persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext
alloc] init];
[_managedObjectContext
setPersistentStoreCoordinator:coordinator];
}
return
_managedObjectContext;
}
// Returns the managed object model for the application.
// If the model doesn't already exist, it is created from the application's model.
- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel !=
nil) {
return
_managedObjectModel;
}
NSURL *modelURL = [[NSBundle
mainBundle] URLForResource:@"MasterCoreData"
withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel
alloc] initWithContentsOfURL:modelURL];
return
_managedObjectModel;
}
// Returns the persistent store coordinator for the application.
// If the coordinator doesn't already exist, it is created and the application's store added to it.
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator !=
nil) {
return
_persistentStoreCoordinator;
}
NSURL *storeURL = [[self
applicationDocumentsDirectory] URLByAppendingPathComponent:@"MasterCoreData.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;
}
#pragma mark - Application's Documents directory
// Returns the URL to the application's Documents directory.
- (NSURL *)applicationDocumentsDirectory
{
return [[[NSFileManager
defaultManager] URLsForDirectory:NSDocumentDirectory
inDomains:NSUserDomainMask]
lastObject];
}