DateSectionTitles/APLAppDelegate.m
/* |
Copyright (C) 2017 Apple Inc. All Rights Reserved. |
See LICENSE.txt for this sample’s licensing information |
Abstract: |
Table view controller to display Events by section. |
The application delegate is almost unchanged from that provided by the standard Xcode template, except that application data is created in the persistentStoreCoordinator method. |
*/ |
#import "APLAppDelegate.h" |
#import "APLMasterViewController.h" |
#import "APLEvent.h" |
@interface APLAppDelegate () |
@property (nonatomic) NSManagedObjectContext *managedObjectContext; |
@property (nonatomic) NSManagedObjectModel *managedObjectModel; |
@property (nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; |
@end |
@implementation APLAppDelegate |
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions |
{ |
// Override point for customization after application launch. |
UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; |
APLMasterViewController *controller = (APLMasterViewController *)navigationController.topViewController; |
controller.managedObjectContext = self.managedObjectContext; |
return YES; |
} |
- (void)saveContext |
{ |
NSError *error; |
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] initWithConcurrencyType:NSMainQueueConcurrencyType]; |
[_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:@"DateSectionTitles" 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:@"DateSectionTitles.dateSectionTitles"]; |
BOOL firstRun = ![storeURL checkResourceIsReachableAndReturnError:NULL]; |
NSError *error; |
_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(); |
} |
/* |
If this is the first run, populate a new store with events whose timestamps are spaced every 7 days throughout 2013 in the Gregorian calendar. |
*/ |
if (firstRun) |
{ |
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; |
[context setPersistentStoreCoordinator:_persistentStoreCoordinator]; |
NSDateComponents *dateComponents = [[NSDateComponents alloc] init]; |
[dateComponents setYear:2013]; |
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; |
[dateFormatter setDateStyle:NSDateFormatterMediumStyle]; |
[dateFormatter setTimeStyle:NSDateFormatterNoStyle]; |
NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSCalendarIdentifierGregorian]; |
[dateFormatter setCalendar:calendar]; |
for (NSInteger day = 1; day < 365; day += 7) |
{ |
[dateComponents setDay:day]; |
NSDate *date = [calendar dateFromComponents:dateComponents]; |
APLEvent *newEvent = [NSEntityDescription insertNewObjectForEntityForName:@"APLEvent" inManagedObjectContext:context]; |
newEvent.timeStamp = date; |
newEvent.title = [NSString stringWithFormat:@"Gregorian: %@ (day %ld)", [dateFormatter stringFromDate:date], [dateComponents day]]; |
} |
[context save:NULL]; |
} |
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]; |
} |
@end |
Copyright © 2017 Apple Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2017-12-21