25 #import "CoreDataHeaders.h"
33 static void EnsureEntitiesHaveProperNames(NSArray * entities)
35 NSMutableSet * knownNames;
37 NSEntityDescription * entity;
39 knownNames = [NSMutableSet setWithCapacity: [entities count]];
40 e = [entities objectEnumerator];
41 while ((entity = [e nextObject]) != nil)
43 NSString * entityName = [entity name];
45 if (entityName == nil)
47 [NSException raise: NSInvalidArgumentException
48 format: _(@"Tried to add an entity without a name "
49 @"to a managed object model.")];
51 if ([knownNames containsObject: entityName])
53 [NSException raise: NSInvalidArgumentException
54 format: _(@"Tried to add several entities with the "
55 @"same name to a managed object model.")];
57 [knownNames addObject: entityName];
61 @interface NSManagedObjectModel (GSCoreDataInternal)
67 - (void) _grabEntities: (NSArray *) entities;
70 - (void) _ungrabEntities: (NSArray *) entities;
77 - (void) _ensureEditableWithReason: (NSString *) reason;
81 @implementation NSManagedObjectModel (GSCoreDataInternal)
83 - (void) _grabEntities: (NSArray *) entities
86 NSEntityDescription * ent;
88 e = [entities objectEnumerator];
89 while ((ent = [e nextObject]) != nil)
91 if ([ent managedObjectModel] != nil && [ent managedObjectModel] !=
self)
93 [NSException raise: NSInvalidArgumentException
94 format: _(@"Passed an entity to an object model already "
95 @"in use by some other model")];
97 [ent _addReferenceToManagedObjectModel: self];
101 - (void) _ungrabEntities: (NSArray *) entities
104 NSEntityDescription * ent;
106 e = [entities objectEnumerator];
107 while ((ent = [e nextObject]) != nil)
109 [ent _removeReferenceToManagedObjectModel: self];
113 - (void) _ensureEditableWithReason: (NSString *) reason
115 if (_usedByPersistentStoreCoordinators)
118 [NSException raise: NSGenericException format: _(reason)];
124 @implementation NSManagedObjectModel
132 [
self _ungrabEntities: _entities];
133 TEST_RELEASE(_entities);
135 e = [_configurations objectEnumerator];
136 while ((entities = [e nextObject]) != nil)
138 [
self _ungrabEntities: entities];
140 TEST_RELEASE(_configurations);
142 TEST_RELEASE(_fetchRequests);
147 + (NSManagedObjectModel *) modelByMergingModels: (NSArray *) models
149 NSManagedObjectModel * newModel;
151 NSMutableArray * entities;
152 NSMutableDictionary * confs;
153 NSMutableDictionary * fetchRequests;
156 NSManagedObjectModel * model;
159 NSString * fetchRequestName;
161 newModel = [[NSManagedObjectModel new] autorelease];
163 entities = [NSMutableArray array];
164 confs = [NSMutableDictionary dictionary];
165 fetchRequests = [NSMutableDictionary dictionary];
168 e = [models objectEnumerator];
169 while ((model = [e nextObject]) != nil)
171 [entities addObjectsFromArray: [[[NSArray alloc]
172 initWithArray: [model entities] copyItems: YES] autorelease]];
174 [confs addEntriesFromDictionary: [[[NSDictionary alloc]
175 initWithDictionary: [model _configurationsByName] copyItems: YES]
179 [fetchRequests addEntriesFromDictionary: [model fetchRequestsByName]];
183 [newModel setEntities: entities];
185 e = [[confs allKeys] objectEnumerator];
186 while ((confName = [e nextObject]) != nil)
188 [newModel setEntities: [confs objectForKey: confName]
189 forConfiguration: confName];
192 e = [[fetchRequests allKeys] objectEnumerator];
193 while ((fetchRequestName = [e nextObject]) != nil)
195 [newModel setFetchRequestTemplate: [fetchRequests objectForKey:
197 forName: fetchRequestName];
203 + (NSManagedObjectModel *) mergedModelFromBundles: (NSArray *) bundles
205 NSArray * modelPaths;
206 NSMutableArray * models;
209 NSString * modelPath;
217 NSMutableArray * array;
219 array = [NSMutableArray array];
221 e = [bundles objectEnumerator];
222 while ((bundle = [e nextObject]) != nil)
224 [array addObjectsFromArray:
225 [bundle pathsForResourcesOfType: @"gsdatamodel" inDirectory: nil]];
233 modelPaths = [[NSBundle mainBundle]
234 pathsForResourcesOfType: @"gsdatamodel" inDirectory: nil];
239 models = [NSMutableArray arrayWithCapacity: [modelPaths count]];
240 e = [modelPaths objectEnumerator];
241 while ((modelPath = [e nextObject]) != nil)
243 [models addObject: [[[NSManagedObjectModel alloc]
244 initWithContentsOfFile: modelPath]
249 return [
self modelByMergingModels: models];
252 - (id) initWithContentsOfURL: (NSURL *) url
259 if ((data = [NSData dataWithContentsOfURL: url]) == nil)
261 NSLog(_(
@"Failed to access managed object model archive at: %@"),
267 return [NSKeyedUnarchiver unarchiveObjectWithData: data];
270 - (id) _initWithContentsOfFile: (NSString *) file
272 return [
self initWithContentsOfURL: [NSURL fileURLWithPath: file]];
277 if ((
self = [super init]))
279 _configurations = [NSMutableDictionary new];
280 _fetchRequests = [NSMutableDictionary new];
285 - (NSArray *) entities
290 - (NSDictionary *) entitiesByName
292 NSMutableDictionary * dict = [NSMutableDictionary
293 dictionaryWithCapacity: [_entities count]];
294 NSEnumerator * e = [_entities objectEnumerator];
295 NSEntityDescription * entity;
297 while ((entity = [e nextObject]) != nil)
299 [dict setObject: entity forKey: [entity name]];
302 return [[dict copy] autorelease];
305 - (void) setEntities: (NSArray *) someEntities
307 [
self _ensureEditableWithReason: @"Tried to set entities of a "
308 @"managed object model already in use by an object graph manager."];
309 EnsureEntitiesHaveProperNames(someEntities);
311 if (_entities != nil)
313 [
self _ungrabEntities: _entities];
316 if (someEntities != nil)
318 _entities = [someEntities copy];
319 [
self _grabEntities: _entities];
323 - (NSArray *) configurations
325 return [_configurations allKeys];
328 - (NSArray *) entitiesForConfiguration: (NSString *) conf
330 return [_configurations objectForKey: conf];
333 - (void) setEntities: (NSArray *) entities
334 forConfiguration: (NSString *) conf
336 NSArray * oldEntities;
338 [
self _ensureEditableWithReason: @"Tried to set entities "
339 @"for a configuration of a managed object model already in use "
340 @"by an object graph manager."];
341 EnsureEntitiesHaveProperNames(entities);
343 oldEntities = [_configurations objectForKey: conf];
344 if (oldEntities != nil)
346 [
self _ungrabEntities: oldEntities];
347 [_configurations removeObjectForKey: conf];
351 [_configurations setObject: [[entities copy] autorelease]
353 [
self _grabEntities: entities];
357 - (NSDictionary *) _configurationsByName
359 return [[_configurations copy] autorelease];
362 - (
NSFetchRequest *) fetchRequestTemplateForName: (NSString *) aName
364 return [_fetchRequests objectForKey: aName];
367 - (
NSFetchRequest *) fetchRequestFromTemplateWithName: (NSString *) name
368 substitutionVariables: (NSDictionary *) vars
372 template = [_fetchRequests objectForKey: name];
378 req = [[template copy] autorelease];
379 if ([req predicate] != nil)
382 predicateWithSubstitutionVariables: vars]];
389 forName: (NSString *) name
391 if (_usedByPersistentStoreCoordinators)
393 [NSException raise: NSGenericException
394 format: _(@"Tried to set a fetch request template "
395 @"for a managed object model already in use "
396 @"by an object graph manager.")];
402 [_fetchRequests setObject: request forKey: name];
406 [_fetchRequests removeObjectForKey: name];
410 - (void) _removeFetchRequestTemplateForName: (NSString *) name
412 if (_usedByPersistentStoreCoordinators)
414 [NSException raise: NSGenericException
415 format: _(@"Tried to remove a fetch request template "
416 @"from a managed object model already in use "
417 @"by an object graph manager.")];
420 [_fetchRequests removeObjectForKey: name];
423 - (NSDictionary *) fetchRequestsByName
425 return [[_fetchRequests copy] autorelease];
428 - (NSDictionary *) localizationDictionary
435 - (void) setLocalizationDictionary: (NSDictionary *) dict
442 return (_usedByPersistentStoreCoordinators == 0);
447 - (id) initWithCoder: (NSCoder *) coder
449 if ((
self = [super init]))
451 if ([coder allowsKeyedCoding])
453 ASSIGN(_entities, [coder decodeObjectForKey:
@"Entities"]);
454 ASSIGN(_configurations, [coder decodeObjectForKey:
456 ASSIGN(_fetchRequests, [coder decodeObjectForKey:
@"FetchRequests"]);
460 ASSIGN(_entities, [coder decodeObject]);
461 ASSIGN(_configurations, [coder decodeObject]);
462 ASSIGN(_fetchRequests, [coder decodeObject]);
468 - (void) encodeWithCoder: (NSCoder *) coder
470 if ([coder allowsKeyedCoding])
472 [coder encodeObject: _entities forKey: @"Entities"];
473 [coder encodeObject: _configurations forKey: @"Configurations"];
474 [coder encodeObject: _fetchRequests forKey: @"FetchRequests"];
478 [coder encodeObject: _entities];
479 [coder encodeObject: _configurations];
480 [coder encodeObject: _fetchRequests];
486 - (id) copyWithZone: (NSZone *) zone
488 NSManagedObjectModel * model;
492 NSString * fetchRequestName;
494 model = [[NSManagedObjectModel allocWithZone: zone] init];
499 [model setEntities: [[[NSArray alloc]
500 initWithArray: _entities copyItems: YES]
503 e = [[_configurations allKeys] objectEnumerator];
504 while ((conf = [e nextObject]) != nil)
506 [model setEntities: [[[NSArray alloc]
507 initWithArray: [_configurations objectForKey: conf]
510 forConfiguration: conf];
514 e = [[_fetchRequests allKeys] objectEnumerator];
515 while ((fetchRequestName = [e nextObject]) != nil)
517 [model setFetchRequestTemplate: [_fetchRequests objectForKey:
519 forName: fetchRequestName];
529 - (void) _incrementUseCount
531 _usedByPersistentStoreCoordinators++;
539 - (void) _decrementUseCount
541 NSAssert(_usedByPersistentStoreCoordinators > 0,
542 _(
@"Tried to underflow managed object model use count."));
544 _usedByPersistentStoreCoordinators--;
An object for storing details about managed object fetches.
void setPredicate:(NSPredicate *aPredicate)
Sets the predicate of the receiver.
NSPredicate * predicate()
Returns the predicate of the receiver.