7

Quando si scrive una libreria statica che utilizza CoreData, c'è un grosso problema che include un normale file .xdatamodeld nel progetto perché non si può semplicemente collegare la sua versione compilata (.momd) nel proprio binario, quindi è meglio per creare l'intera NSManagedObjectModel nel codice come questo:Aggiunta di relazioni in NSManagedObjectModel a NSEntityDescription creato a livello di programmazione

NSAttributeDescription *dateAttribute = NSAttributeDescription.new; 

dateAttribute.name = @"timestamp"; 
dateAttribute.attributeType = NSDoubleAttributeType; 
dateAttribute.optional = NO; 
dateAttribute.indexed = YES; 

NSAttributeDescription *payloadAttribute = NSAttributeDescription.new; 

payloadAttribute.name = @"payload"; 
payloadAttribute.attributeType = NSBinaryDataAttributeType; 
payloadAttribute.optional = NO; 
payloadAttribute.indexed = NO; 

NSEntityDescription *entry = NSEntityDescription.new; 

entry.name = entry.managedObjectClassName = NSStringFromClass(MyCustomEntry.class); 
entry.properties = @[dateAttribute, payloadAttribute]; 

NSManagedObjectModel *mom = NSManagedObjectModel.new; 

mom.entities = @[entry]; 

E tutto è perfetto ....

Ma! Aspetta, se ho più di un'entità nel mio NSManagedObjectModel e sono correlati (to-many, inversed, e così via), come nel mondo li collegherò nel codice, come nell'esempio sopra, senza quel simpatico editor Xcode , dove si fanno relazioni con diversi clic del mouse?

Esempio

Immaginate, abbiamo un MyCustomElement classe, che è quasi la stessa come nel MyCustomEntry dal codice di cui sopra. Ora, here're loro interfacce come apparirebbero se ho usato generazione Xcode per le entità:

@interface MyCustomEntry : NSManagedObject 

@property (nonatomic, retain) NSNumber *timestamp; 
@property (nonatomic, retain) NSData *payload; 
@property (nonatomic, retain) MyCustomElement *element; 

@end 

@interface MyCustomElement : NSManagedObject 

@property (nonatomic, retain) NSNumber * timestamp; 
@property (nonatomic, retain) NSString * identifier; 
@property (nonatomic, retain) NSSet *entries; 

@end 

@interface MyCustomElement (CoreDataGeneratedAccessors) 

- (void)addEntriesObject:(MyCustomEntry *)value; 
- (void)removeEntriesObject:(MyCustomEntry *)value; 
- (void)addEntries:(NSSet *)values; 
- (void)removeEntries:(NSSet *)values; 

@end 

Cosa NSRelationshipDescription ho bisogno di creare per loro e come a init esso?

risposta

16

Le relazioni sono descritte da NSRelationshipDescription oggetti. Il codice seguente crea due descrizioni di entità per "MyCustomEntry", "MyCustomElement" con le relazioni

  • entries (MyCustomElement -> MyCustomEntry, a-molti),
  • element (MyCustomEntry -> MyCustomElement, to-one), inverso a entries.

Entrambe le entità hanno solo un attributo di stringa "identificatore" (per salvare alcune righe di codice).

Objective-C:

NSEntityDescription *entry = [[NSEntityDescription alloc] init]; 
[entry setName:@"MyCustomEntry"]; 
[entry setManagedObjectClassName:@"MyCustomEntry"]; 

NSAttributeDescription *entryIdAttribute = [[NSAttributeDescription alloc] init]; 
entryIdAttribute.name = @"identifier"; 
entryIdAttribute.attributeType = NSStringAttributeType; 

NSEntityDescription *element = [[NSEntityDescription alloc] init]; 
[element setName:@"MyCustomElement"]; 
[element setManagedObjectClassName:@"MyCustomElement"]; 

NSAttributeDescription *elementIdAttribute = [[NSAttributeDescription alloc] init]; 
elementIdAttribute.name = @"identifier"; 
elementIdAttribute.attributeType = NSStringAttributeType; 

// To-many relationship from "Element" to "Entry": 
NSRelationshipDescription *entriesRelation = [[NSRelationshipDescription alloc] init]; 

// To-one relationship from "Entry" to "Element": 
NSRelationshipDescription *elementRelation = [[NSRelationshipDescription alloc] init]; 

[entriesRelation setName:@"entries"]; 
[entriesRelation setDestinationEntity:entry]; 
[entriesRelation setMinCount:0]; 
[entriesRelation setMaxCount:0]; // max = 0 for to-many relationship 
[entriesRelation setDeleteRule:NSCascadeDeleteRule]; 
[entriesRelation setInverseRelationship:elementRelation]; 

[elementRelation setName:@"element"]; 
[elementRelation setDestinationEntity:element]; 
[elementRelation setMinCount:0]; 
[elementRelation setMaxCount:1]; // max = 1 for to-one relationship 
[elementRelation setDeleteRule:NSNullifyDeleteRule]; 
[elementRelation setInverseRelationship:entriesRelation]; 

[entry setProperties:@[entryIdAttribute, elementRelation]]; 
[element setProperties:@[elementIdAttribute, entriesRelation]]; 

NSManagedObjectModel *mom = [[NSManagedObjectModel alloc] init]; 
[mom setEntities:@[entry, element]]; 

Swift:

let entry = NSEntityDescription() 
entry.name = "MyCustomEntry" 
entry.managedObjectClassName = "MyCustomEntry" 

let entryIdAttribute = NSAttributeDescription() 
entryIdAttribute.name = "identifier"; 
entryIdAttribute.attributeType = .StringAttributeType; 

let element = NSEntityDescription() 
element.name = "MyCustomElement" 
element.managedObjectClassName = "MyCustomElement" 

let elementIdAttribute = NSAttributeDescription() 
elementIdAttribute.name = "identifier" 
elementIdAttribute.attributeType = .StringAttributeType 

// To-many relationship from "Element" to "Entry": 
let entriesRelation = NSRelationshipDescription() 

// To-one relationship from "Entry" to "Element": 
let elementRelation = NSRelationshipDescription() 

entriesRelation.name = "entries" 
entriesRelation.destinationEntity = entry 
entriesRelation.minCount = 0 
entriesRelation.maxCount = 0 // max = 0 for to-many relationship 
entriesRelation.deleteRule = .CascadeDeleteRule 
entriesRelation.inverseRelationship = elementRelation 

elementRelation.name = "element" 
elementRelation.destinationEntity = element 
elementRelation.minCount = 0 
elementRelation.maxCount = 1 // max = 1 for to-one relationship 
elementRelation.deleteRule = .NullifyDeleteRule 
elementRelation.inverseRelationship = entriesRelation 

entry.properties = [entryIdAttribute, elementRelation] 
element.properties = [elementIdAttribute, entriesRelation] 

let mom = NSManagedObjectModel() 
mom.entities = [entry, element] 

Ho testato questo codice e sembra funzionare, quindi spero che sarà utile a voi.

+0

Si prega di controllare la domanda aggiornata con un esempio. – shoumikhin

+0

@shoumikhin: Ho aggiunto codice di esempio alla mia risposta. –

+0

Fantastico, grazie! – shoumikhin