This repository was archived by the owner on Sep 12, 2018. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 187
Expand file tree
/
Copy pathCoreDataManager.m
More file actions
157 lines (114 loc) · 5.02 KB
/
CoreDataManager.m
File metadata and controls
157 lines (114 loc) · 5.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
//
// CoreDataManager.m
// WidgetPush
//
// Created by Marin on 9/1/11.
// Copyright (c) 2011 mneorr.com. All rights reserved.
//
#import "CoreDataManager.h"
@implementation CoreDataManager
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
@synthesize databaseName = _databaseName;
@synthesize modelName = _modelName;
+ (id)instance {
return [self sharedManager];
}
+ (instancetype)sharedManager {
static CoreDataManager *singleton;
static dispatch_once_t singletonToken;
dispatch_once(&singletonToken, ^{
singleton = [[self alloc] init];
});
return singleton;
}
#pragma mark - Private
- (NSString *)appName {
return [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
}
- (NSString *)databaseName {
if (_databaseName != nil) return _databaseName;
_databaseName = [[[self appName] stringByAppendingString:@".sqlite"] copy];
return _databaseName;
}
- (NSString *)modelName {
if (_modelName != nil) return _modelName;
_modelName = [[self appName] copy];
return _modelName;
}
#pragma mark - Public
- (NSManagedObjectContext *)managedObjectContext {
if (_managedObjectContext) return _managedObjectContext;
if (self.persistentStoreCoordinator) {
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
}
return _managedObjectContext;
}
- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel) return _managedObjectModel;
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:[self modelName] withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator) return _persistentStoreCoordinator;
_persistentStoreCoordinator = [self persistentStoreCoordinatorWithStoreType:NSSQLiteStoreType
storeURL:[self sqliteStoreURL]];
return _persistentStoreCoordinator;
}
- (void)useInMemoryStore {
_persistentStoreCoordinator = [self persistentStoreCoordinatorWithStoreType:NSInMemoryStoreType storeURL:nil];
}
- (BOOL)saveContext {
if (self.managedObjectContext == nil) return NO;
if (![self.managedObjectContext hasChanges])return NO;
NSError *error = nil;
if (![self.managedObjectContext save:&error]) {
NSLog(@"Unresolved error in saving context! %@, %@", error, [error userInfo]);
return NO;
}
return YES;
}
- (void)setDefaultModelFromClass:(Class)klass {
NSBundle *bundle = [NSBundle bundleForClass:klass];
_managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:[NSArray arrayWithObject:bundle]];
}
#pragma mark - SQLite file directory
- (NSURL *)applicationDocumentsDirectory {
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory
inDomains:NSUserDomainMask] lastObject];
}
- (NSURL *)applicationSupportDirectory {
return [[[[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory
inDomains:NSUserDomainMask] lastObject]
URLByAppendingPathComponent:[self appName]];
}
#pragma mark - Private
- (NSPersistentStoreCoordinator *)persistentStoreCoordinatorWithStoreType:(NSString *const)storeType
storeURL:(NSURL *)storeURL {
NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = @{ NSMigratePersistentStoresAutomaticallyOption: @YES,
NSInferMappingModelAutomaticallyOption: @YES };
NSError *error = nil;
if (![coordinator addPersistentStoreWithType:storeType configuration:nil URL:storeURL options:options error:&error])
NSLog(@"ERROR WHILE CREATING PERSISTENT STORE COORDINATOR! %@, %@", error, [error userInfo]);
return coordinator;
}
- (NSURL *)sqliteStoreURL {
NSURL *directory = [self isOSX] ? self.applicationSupportDirectory : self.applicationDocumentsDirectory;
NSURL *databaseDir = [directory URLByAppendingPathComponent:[self databaseName]];
[self createApplicationSupportDirIfNeeded:directory];
return databaseDir;
}
- (BOOL)isOSX {
if (NSClassFromString(@"UIDevice")) return NO;
return YES;
}
- (void)createApplicationSupportDirIfNeeded:(NSURL *)url {
if ([[NSFileManager defaultManager] fileExistsAtPath:url.absoluteString]) return;
[[NSFileManager defaultManager] createDirectoryAtURL:url
withIntermediateDirectories:YES attributes:nil error:nil];
}
@end