From 25b419b09199896ddfa66d31c8ea9f36d965b4a9 Mon Sep 17 00:00:00 2001 From: Marco Paga Date: Wed, 18 May 2011 18:43:15 +0200 Subject: [PATCH] Moved persistence related stuff from the AppDelegate to COPersistence --- COAppDelegate.h | 13 +-- COAppDelegate.m | 111 ++++------------------- COConstants.h | 2 + COConstants.m | 2 + COPersistence.h | 24 +++++ COPersistence.m | 90 ++++++++++++++++++ Correspondence.xcodeproj/project.pbxproj | 10 ++ 7 files changed, 152 insertions(+), 100 deletions(-) create mode 100644 COPersistence.h create mode 100644 COPersistence.m diff --git a/COAppDelegate.h b/COAppDelegate.h index b59e344..da45df3 100644 --- a/COAppDelegate.h +++ b/COAppDelegate.h @@ -7,21 +7,18 @@ // #import +#import "COConstants.h" +#import "COPersistence.h" @interface COAppDelegate : NSObject { - IBOutlet NSWindow *window; - - NSPersistentStoreCoordinator *persistentStoreCoordinator; - NSManagedObjectModel *managedObjectModel; - NSManagedObjectContext *managedObjectContext; - + IBOutlet NSWindow* window; + COPersistence* persistence; } -- (NSPersistentStoreCoordinator *)persistentStoreCoordinator; -- (NSManagedObjectModel *)managedObjectModel; - (NSManagedObjectContext *)managedObjectContext; +- (NSString *)applicationSupportFolder; - (IBAction)saveAction:sender; @end diff --git a/COAppDelegate.m b/COAppDelegate.m index 28747c3..1f8d588 100644 --- a/COAppDelegate.m +++ b/COAppDelegate.m @@ -11,6 +11,21 @@ @implementation COAppDelegate +- (id)init +{ + self = [super init]; + if (self) { + persistence = [[COPersistence alloc] init]; + } + + return self; +} + +- (NSManagedObjectContext *)managedObjectContext +{ + return [persistence managedObjectContext]; +} + /** Returns the support folder for the application, used to store the Core Data store file. This code uses a folder named "Correspondence" for @@ -22,81 +37,9 @@ - (NSString *)applicationSupportFolder { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES); NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : NSTemporaryDirectory(); - return [basePath stringByAppendingPathComponent:@"Correspondence"]; -} - - -/** - Creates, retains, and returns the managed object model for the application - by merging all of the models found in the application bundle. - */ - -- (NSManagedObjectModel *)managedObjectModel { - - if (managedObjectModel != nil) { - return managedObjectModel; - } - - managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; - return managedObjectModel; + return [basePath stringByAppendingPathComponent: APP_NAME]; } - -/** - Returns the persistent store coordinator for the application. This - implementation will create and return a coordinator, having added the - store for the application to it. (The folder for the store is created, - if necessary.) - */ - -- (NSPersistentStoreCoordinator *) persistentStoreCoordinator { - - if (persistentStoreCoordinator != nil) { - return persistentStoreCoordinator; - } - - NSFileManager *fileManager; - NSString *applicationSupportFolder = nil; - NSURL *url; - NSError *error; - - fileManager = [NSFileManager defaultManager]; - applicationSupportFolder = [self applicationSupportFolder]; - if ( ![fileManager fileExistsAtPath:applicationSupportFolder isDirectory:NULL] ) { - [fileManager createDirectoryAtPath:applicationSupportFolder withIntermediateDirectories:YES attributes:nil error:&error]; - } - - url = [NSURL fileURLWithPath: [applicationSupportFolder stringByAppendingPathComponent: @"Correspondence.sqlite"]]; - persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; - if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error]){ - [[NSApplication sharedApplication] presentError:error]; - } - - return persistentStoreCoordinator; -} - - -/** - Returns the managed object context for the application (which is already - 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 NSUndoManager for the application. In this case, the manager returned is that of the managed object context for the application. @@ -121,7 +64,6 @@ - (IBAction) saveAction:(id)sender { } } - /** Implementation of the applicationShouldTerminate: method, used here to handle the saving of changes in the application managed object context @@ -133,9 +75,9 @@ - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sende NSError *error; int reply = NSTerminateNow; - if (managedObjectContext != nil) { - if ([managedObjectContext commitEditing]) { - if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) { + if ([self managedObjectContext] != nil) { + if ([[self managedObjectContext] commitEditing]) { + if ([[self managedObjectContext] hasChanges] && ![[self managedObjectContext]save:&error]) { // This error handling simply presents error information in a panel with an // "Ok" button, which does not include any attempt at error recovery (meaning, @@ -170,19 +112,4 @@ - (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sende return reply; } - -/** - Implementation of dealloc, to release the retained variables. - */ - -- (void) dealloc { - - [managedObjectContext release], managedObjectContext = nil; - [persistentStoreCoordinator release], persistentStoreCoordinator = nil; - [managedObjectModel release], managedObjectModel = nil; - - [super dealloc]; -} - - @end diff --git a/COConstants.h b/COConstants.h index 9a280e8..ed4a8c5 100644 --- a/COConstants.h +++ b/COConstants.h @@ -8,6 +8,8 @@ #import +extern NSString* const APP_NAME; + extern NSString* const ENTITY_ADDRESSBOOK_PERSON; extern NSString* const ENTITY_PERSON; diff --git a/COConstants.m b/COConstants.m index 1455e66..8320853 100644 --- a/COConstants.m +++ b/COConstants.m @@ -8,6 +8,8 @@ #import "COConstants.h" +NSString* const APP_NAME = @"Correspondence"; + NSString* const ENTITY_ADDRESSBOOK_PERSON = @"AddressbookPerson"; NSString* const ENTITY_PERSON = @"Person"; diff --git a/COPersistence.h b/COPersistence.h new file mode 100644 index 0000000..7ae3e1b --- /dev/null +++ b/COPersistence.h @@ -0,0 +1,24 @@ +// +// COPersistence.h +// Correspondence +// +// Created by Marco Paga on 18.05.11. +// Copyright 2011 The Correspondence Team. All rights reserved. +// + +#import +#import "COConstants.h" + + +@interface COPersistence : NSObject +{ + NSPersistentStoreCoordinator *persistentStoreCoordinator; + NSManagedObjectModel *managedObjectModel; + NSManagedObjectContext *managedObjectContext; +} + +- (NSPersistentStoreCoordinator *)persistentStoreCoordinator; +- (NSManagedObjectModel *)managedObjectModel; +- (NSManagedObjectContext *)managedObjectContext; + +@end diff --git a/COPersistence.m b/COPersistence.m new file mode 100644 index 0000000..815c55e --- /dev/null +++ b/COPersistence.m @@ -0,0 +1,90 @@ +// +// COPersistence.m +// Correspondence +// +// Created by Marco Paga on 18.05.11. +// Copyright 2011 The Correspondence Team. All rights reserved. +// + +#import "COPersistence.h" + + +@implementation COPersistence + +- (id)init +{ + self = [super init]; + if (self) { + // Initialization code here. + } + + return self; +} + +- (NSManagedObjectModel *)managedObjectModel { + + if (managedObjectModel != nil) { + return managedObjectModel; + } + + managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain]; + return managedObjectModel; +} + +- (NSPersistentStoreCoordinator *) persistentStoreCoordinator { + + if (persistentStoreCoordinator != nil) { + return persistentStoreCoordinator; + } + + NSFileManager *fileManager; + NSString *applicationSupportFolder = nil; + NSURL *url; + NSError *error; + + fileManager = [NSFileManager defaultManager]; + applicationSupportFolder = [[[NSApplication sharedApplication] delegate] applicationSupportFolder]; + if ( ![fileManager fileExistsAtPath:applicationSupportFolder isDirectory:NULL] ) { + [fileManager createDirectoryAtPath:applicationSupportFolder withIntermediateDirectories:YES attributes:nil error:&error]; + } + + NSString* coreDataFile = [APP_NAME stringByAppendingString:@".sqlite"]; + url = [NSURL fileURLWithPath: [applicationSupportFolder stringByAppendingPathComponent: coreDataFile]]; + persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]]; + if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error]){ + [[NSApplication sharedApplication] presentError:error]; + } + + return persistentStoreCoordinator; +} + +- (NSManagedObjectContext *) managedObjectContext { + + if (managedObjectContext != nil) { + return managedObjectContext; + } + + NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; + if (coordinator != nil) { + managedObjectContext = [[NSManagedObjectContext alloc] init]; + [managedObjectContext setPersistentStoreCoordinator: coordinator]; + } + + return managedObjectContext; +} + +- (void)dealloc +{ + [managedObjectContext release]; + managedObjectContext = nil; + + [persistentStoreCoordinator release]; + persistentStoreCoordinator = nil; + + [managedObjectModel release]; + managedObjectModel = nil; + + [super dealloc]; +} + +@end diff --git a/Correspondence.xcodeproj/project.pbxproj b/Correspondence.xcodeproj/project.pbxproj index dea4eec..8d6575e 100644 --- a/Correspondence.xcodeproj/project.pbxproj +++ b/Correspondence.xcodeproj/project.pbxproj @@ -68,6 +68,9 @@ A9CB4BB913572E18009A166C /* TopicViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9CB4BB713572E18009A166C /* TopicViewCell.xib */; }; A9CB4BBB13572E60009A166C /* CustomAddress.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9CB4BBA13572E60009A166C /* CustomAddress.xib */; }; A9CB4BBD13572E85009A166C /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = A9CB4BBC13572E85009A166C /* MainMenu.xib */; }; + A9EF1EA313839AFC005FA213 /* COPersistence.m in Sources */ = {isa = PBXBuildFile; fileRef = A9EF1EA213839AFC005FA213 /* COPersistence.m */; }; + A9EF1EA413839AFC005FA213 /* COPersistence.m in Sources */ = {isa = PBXBuildFile; fileRef = A9EF1EA213839AFC005FA213 /* COPersistence.m */; }; + A9EF1EA613842DE7005FA213 /* COConstants.m in Sources */ = {isa = PBXBuildFile; fileRef = A974397A13351EDD00D4262D /* COConstants.m */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ @@ -144,6 +147,8 @@ A9CB4BBC13572E85009A166C /* MainMenu.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = MainMenu.xib; path = Resources/MainMenu.xib; sourceTree = ""; }; A9CB4BBE1357316C009A166C /* ReceiverTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReceiverTests.h; sourceTree = ""; }; A9CB4BBF1357316C009A166C /* ReceiverTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReceiverTests.m; sourceTree = ""; }; + A9EF1EA113839AFC005FA213 /* COPersistence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = COPersistence.h; sourceTree = ""; }; + A9EF1EA213839AFC005FA213 /* COPersistence.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = COPersistence.m; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -183,6 +188,8 @@ A9A5BA5B13364535001EDA12 /* COCustomAddressHUDController.m */, A95F8E13134CD9B500C16004 /* COSharedContext.h */, A95F8E14134CD9B500C16004 /* COSharedContext.m */, + A9EF1EA113839AFC005FA213 /* COPersistence.h */, + A9EF1EA213839AFC005FA213 /* COPersistence.m */, ); name = Classes; sourceTree = ""; @@ -511,6 +518,7 @@ A9CB4BB113572918009A166C /* COAddressbookPerson.m in Sources */, A9CB4BB413572918009A166C /* COPerson.m in Sources */, 2E33CB8E137FBF70009CAA35 /* PXListView+UserInteraction.m in Sources */, + A9EF1EA313839AFC005FA213 /* COPersistence.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -532,10 +540,12 @@ A99F6233135734E1001F69CE /* COMessage.m in Sources */, 2E3B31A0132EB88A002F8803 /* COTopicViewCell.m in Sources */, 2EE6558A13315D610039973A /* COListView.m in Sources */, + A9EF1EA613842DE7005FA213 /* COConstants.m in Sources */, 2E4DF47A13316F2A0044C9D1 /* COListController.m in Sources */, 2E3FBA0D134F9B8500DB95B2 /* COManagedViewCell.m in Sources */, A966F740137F11EF007488DA /* AbstractCoreDataTest.m in Sources */, 2E33CB8F137FBF70009CAA35 /* PXListView+UserInteraction.m in Sources */, + A9EF1EA413839AFC005FA213 /* COPersistence.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; };