-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathStoredModel.m
More file actions
255 lines (204 loc) · 7.81 KB
/
StoredModel.m
File metadata and controls
255 lines (204 loc) · 7.81 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
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
//
// StoredModel.m
// memory
#import "StoredModel.h"
static NSManagedObjectContext *storedModelContext = nil;
@interface StoredModel (private)
+ (NSMutableArray *)_findResults:(NSFetchRequest *)request;
+ (NSNumber *)_countResults:(NSFetchRequest *)request;
+ (NSArray *)_sortDescriptorsFromOrderString:(NSString *)orderString;
@end
@implementation StoredModel
#pragma mark Context access methods
+ (void)setContext:(NSManagedObjectContext *)newContext {
storedModelContext = newContext;
}
+ (NSManagedObjectContext *)context {
return storedModelContext;
}
- (NSManagedObjectContext *)context {
return [[self class] context];
}
#pragma mark -
#pragma mark Class methods for Core Data
+ (NSString *)name {
return [NSString stringWithCString:object_getClassName(self) encoding:NSASCIIStringEncoding];
}
+ (id)new {
NSEntityDescription *description = [NSEntityDescription entityForName:[self name] inManagedObjectContext:[self context]];
return [[self alloc] initWithEntity:description insertIntoManagedObjectContext:[self context]];
}
+ (id)new:(NSDictionary *)dictionary {
id instance = [self new];
NSString *propertyName;
for (propertyName in dictionary) {
[instance setValue:[dictionary objectForKey:propertyName] forKey:propertyName];
}
return instance;
}
// Order can either be something like @"order" or @"order desc"
+ (NSFetchRequest *)fetchRequestByOrder:(NSString *)orderString andQuery:(NSString* )queryString, ... {
NSFetchRequest *request = [self defaultFetchRequest];
if ([orderString length] > 0) [request setSortDescriptors:[self _sortDescriptorsFromOrderString:orderString]];
if ([queryString length] > 0) {
va_list argumentList;
va_start(argumentList, queryString);
NSString *sqlString = [[NSString alloc] initWithFormat:queryString arguments:argumentList];
[request setPredicate:[NSPredicate predicateWithFormat:sqlString]];
}
return request;
}
+ (NSFetchRequest *)fetchRequestByOrder:(NSString *)orderString {
return [self fetchRequestByOrder:orderString andQuery:@""];
}
+ (NSFetchRequest *)fetchRequest:(NSString* )queryString, ... {
va_list argumentList;
va_start(argumentList, queryString);
NSString *sqlString = [[NSString alloc] initWithFormat:queryString arguments:argumentList];
return [self fetchRequestByOrder:@"" andQuery:sqlString];
}
+ (NSFetchRequest *)defaultFetchRequest {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:[self name] inManagedObjectContext:[self context]];
[request setEntity:entity];
return request;
}
#pragma mark -
#pragma mark Querying methods
#pragma mark - Collection finding
+ (NSMutableArray *)findByOrder:(NSString *)orderString andQuery:(NSString *)queryString, ... {
va_list argumentList;
va_start(argumentList, queryString);
NSString *sqlString = [[NSString alloc] initWithFormat:queryString arguments:argumentList];
return [self _findResults:[self fetchRequestByOrder:orderString andQuery:sqlString]];
}
+ (NSMutableArray *)findByOrder:(NSString *)orderString {
return [self _findResults:[self fetchRequestByOrder:orderString]];
}
+ (NSMutableArray *)find:(NSString *)queryString, ... {
va_list argumentList;
va_start(argumentList, queryString);
NSString *sqlString = [[NSString alloc] initWithFormat:queryString arguments:argumentList];
return [self _findResults:[self fetchRequest:sqlString]];
}
+ (NSMutableArray *)findByKey:(NSString *)key withValue:(id)value {
NSString *sqlString;
if ([value isKindOfClass:[NSDate class]]) sqlString = [NSString stringWithFormat:@"%@ = %@", key, [(NSDate *)value queryFormat]];
else sqlString = [NSString stringWithFormat:@"%@ = '%@'", key, value];
NSLog(@"sql = %@", sqlString);
return [self find:sqlString];
}
+ (NSMutableArray *)all {
return [self _findResults:[self defaultFetchRequest]];
}
#pragma mark - Single record finding
+ (id)findFirstByOrder:(NSString *)orderString andQuery:(NSString *)queryString, ... {
va_list argumentList;
va_start(argumentList, queryString);
NSString *sqlString = [[NSString alloc] initWithFormat:queryString arguments:argumentList];
NSMutableArray *objects = [self findByOrder:orderString andQuery:sqlString];
if ([objects count] > 0) return [objects objectAtIndex:0];
else return nil;
}
+ (id)findFirstByOrder:(NSString *)orderString {
return [self findFirstByOrder:orderString andQuery:@""];
}
+ (id)findFirst:(NSString *)queryString, ... {
va_list argumentList;
va_start(argumentList, queryString);
NSString *sqlString = [[NSString alloc] initWithFormat:queryString arguments:argumentList];
NSMutableArray *objects = [self find:sqlString];
if ([objects count] > 0) return [objects objectAtIndex:0];
else return nil;
}
+ (id)findFirstByKey:(NSString *)key withValue:(id)value {
NSArray *objects = [self findByKey:key withValue:value];
if ([objects count] > 0) return [objects objectAtIndex:0];
else return nil;
}
+ (id)findFirst {
NSMutableArray *objects = [self all];
if ([objects count] > 0) return [objects objectAtIndex:0];
else return nil;
}
+ (id)findByID:(NSManagedObjectID *)objectID {
return [[self context] objectRegisteredForID:objectID];
}
#pragma mark - Counting
+ (NSNumber *)count:(NSString *)queryString, ... {
va_list argumentList;
va_start(argumentList, queryString);
NSString *sqlString = [[NSString alloc] initWithFormat:queryString arguments:argumentList];
return [self _countResults:[self fetchRequest:sqlString]];
}
+ (NSNumber *)count {
return [self _countResults:[self defaultFetchRequest]];
}
#pragma mark -
+ (void)deleteAll {
for (id object in [self all]) [[self context] deleteObject:object];
NSError *error = nil;
if (![[self context] save:&error]) {
// Handle error
}
}
#pragma mark - Private methods
+ (NSMutableArray *)_findResults:(NSFetchRequest *)request {
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[[self context] executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
// Handle the error.
}
[request release];
return mutableFetchResults;
}
+ (NSNumber *)_countResults:(NSFetchRequest *)request {
NSError *error = nil;
int number = [[self context] countForFetchRequest:request error:&error];
return [NSNumber numberWithInt:number];
}
+ (NSArray *)_sortDescriptorsFromOrderString:(NSString *)orderString {
NSArray *orderComponents = [orderString componentsSeparatedByString:@" "];
NSString *order = [orderComponents objectAtIndex:0];
BOOL ascending = YES;
if ([orderComponents count] > 1) {
NSString *direction = [orderComponents objectAtIndex:1];
if ([direction isEqualToString:@"desc"]) ascending = NO;
}
NSArray *result = [NSArray arrayWithObject:[[NSSortDescriptor alloc] initWithKey:order ascending:ascending]];
[order release];
return result;
}
#pragma mark - Instance Methods
// This ensures that after we save an object, it is up to date with data in the persistent store
- (BOOL)save {
NSError *error = nil;
BOOL success = YES;
if (![[self context] save:&error]) {
NSLog(@">>>>>> Error saving: %@", error);
success = NO;
}
[[self context] refreshObject:self mergeChanges:NO];
return success;
}
- (BOOL)destroy {
NSError *error = nil;
BOOL success = YES;
NSManagedObjectContext *context = [self context];
[context deleteObject:self];
if (![context save:&error]) {
NSLog(@">>>>>> Error destroying: %@", error);
success = NO;
}
return success;
}
- (int)persistenceID {
NSArray *components = [[[[self objectID] URIRepresentation] path] componentsSeparatedByString:@"/"];
NSCharacterSet *charSet = [NSCharacterSet decimalDigitCharacterSet];
NSScanner *scanner = [NSScanner scannerWithString:[components objectAtIndex:[components count]-1]];
[scanner scanUpToCharactersFromSet:charSet intoString:nil];
int pID;
[scanner scanInt:&pID];
return pID;
}
@end