Skip to content

Commit

Permalink
Moved persistence related stuff from the AppDelegate to COPersistence
Browse files Browse the repository at this point in the history
  • Loading branch information
marcopaga committed May 18, 2011
1 parent 376ff28 commit 25b419b
Show file tree
Hide file tree
Showing 7 changed files with 152 additions and 100 deletions.
13 changes: 5 additions & 8 deletions COAppDelegate.h
Expand Up @@ -7,21 +7,18 @@
//

#import <Cocoa/Cocoa.h>
#import "COConstants.h"
#import "COPersistence.h"

@interface COAppDelegate : NSObject <NSApplicationDelegate>
{
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
111 changes: 19 additions & 92 deletions COAppDelegate.m
Expand Up @@ -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
Expand All @@ -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.
Expand All @@ -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
Expand All @@ -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,
Expand Down Expand Up @@ -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
2 changes: 2 additions & 0 deletions COConstants.h
Expand Up @@ -8,6 +8,8 @@

#import <Foundation/Foundation.h>

extern NSString* const APP_NAME;

extern NSString* const ENTITY_ADDRESSBOOK_PERSON;
extern NSString* const ENTITY_PERSON;

Expand Down
2 changes: 2 additions & 0 deletions COConstants.m
Expand Up @@ -8,6 +8,8 @@

#import "COConstants.h"

NSString* const APP_NAME = @"Correspondence";

NSString* const ENTITY_ADDRESSBOOK_PERSON = @"AddressbookPerson";
NSString* const ENTITY_PERSON = @"Person";

Expand Down
24 changes: 24 additions & 0 deletions 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 <Foundation/Foundation.h>
#import "COConstants.h"


@interface COPersistence : NSObject
{
NSPersistentStoreCoordinator *persistentStoreCoordinator;
NSManagedObjectModel *managedObjectModel;
NSManagedObjectContext *managedObjectContext;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator;
- (NSManagedObjectModel *)managedObjectModel;
- (NSManagedObjectContext *)managedObjectContext;

@end
90 changes: 90 additions & 0 deletions 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
10 changes: 10 additions & 0 deletions Correspondence.xcodeproj/project.pbxproj
Expand Up @@ -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 */
Expand Down Expand Up @@ -144,6 +147,8 @@
A9CB4BBC13572E85009A166C /* MainMenu.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = MainMenu.xib; path = Resources/MainMenu.xib; sourceTree = "<group>"; };
A9CB4BBE1357316C009A166C /* ReceiverTests.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ReceiverTests.h; sourceTree = "<group>"; };
A9CB4BBF1357316C009A166C /* ReceiverTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ReceiverTests.m; sourceTree = "<group>"; };
A9EF1EA113839AFC005FA213 /* COPersistence.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = COPersistence.h; sourceTree = "<group>"; };
A9EF1EA213839AFC005FA213 /* COPersistence.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = COPersistence.m; sourceTree = "<group>"; };
/* End PBXFileReference section */

/* Begin PBXFrameworksBuildPhase section */
Expand Down Expand Up @@ -183,6 +188,8 @@
A9A5BA5B13364535001EDA12 /* COCustomAddressHUDController.m */,
A95F8E13134CD9B500C16004 /* COSharedContext.h */,
A95F8E14134CD9B500C16004 /* COSharedContext.m */,
A9EF1EA113839AFC005FA213 /* COPersistence.h */,
A9EF1EA213839AFC005FA213 /* COPersistence.m */,
);
name = Classes;
sourceTree = "<group>";
Expand Down Expand Up @@ -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;
};
Expand All @@ -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;
};
Expand Down

0 comments on commit 25b419b

Please sign in to comment.