ajouter <Key> objet vs insertNewObjectForEntityForName de base de données Relations
Salut,
Bien que j'ai beaucoup d'expérience dans le développement de la base de données, je suis un moment difficile de conceptualiser liant les relations dans les données fondamentales. Si je comprends bien, la relation de nombreux est un NSSet attaché à un fichier. Après avoir lu la documentation, j'en ai compris une partie et je l'ai fait fonctionner dans la première importation dans mon code ci-dessous.
J'ai un modèle de données dans lequel j'effectue deux importations distinctes en utilisant le XMLParser. La première importation charge les événements et les catégories du même fichier XML dans la même importation comme suit:
if (thisTagIsForOneTable) {
// Insert object for the one-entity (Events)
self.eventsObject = [NSEntityDescription insertNewObjectForEntityForName:@"Events" inManagedObjectContext:xmlManagedObjectContext];
return;
}
if (thisTagIsForManyTable) {
// Insert object for many-entity (EventCategories)
self.categoriesObject = [NSEntityDescription insertNewObjectForEntityForName:@"EventCategories" inManagedObjectContext:xmlManagedObjectContext];
return;
}
......
// Set attribute values depending upon whether the tag is for the one-entity or the many-entity.
[self.xxxObject setValue:trimmedString forKey:attributeName];
......
// Set the relationship. This works great!
if (thisTagIsForManyTable) {
NSMutableSet *manyRecordSet = [self.eventsObject mutableSetValueForKey:@"categories"]; // My relationship name.
[manyRecordSet addObject:self.categoriesObject];
}
// Save the context. Voila.
Ce qui précède fonctionne correctement. La deuxième importation charge séparément EventLocations dans une partie différente de l'application, donc j'ai besoin de définir sa relation to-one aux événements. C'est là que je ne suis pas trop sûr. Les étapes devraient-elles être?
// Step A) Create (insert) new EventLocations object.
self.eventLocationsObject = [NSEntityDescription insertNewObjectForEntityForName:@"EventLocations" inManagedObjectContext:xmlManagedObjectContext];
// Step B) Locate and get a reference to the the related one-entity's object (Events) by ID? I have a custom class for Events.
// This seems to work but I'm taking a performance hit and getting a compiler warning below. The method returnObjectForEntity does a query and returns an NSManagedObject. Is this correct?
Events *event = (Events *)[self returnObjectForEntity:@"Events" withID:[oneRecordObject valueForKey:@"infIDCode"]];
// Step C) Set the relationship to the Events entity.
if (event) {
[event addLocationsObject:self.eventLocationsObject];
// Compiler warning: incompatible Objective-C types 'struct NSManagedObject *', expected 'struct EventLocations *' when passing argument 1 of 'addLocationsObject:' from distinct Objective-C type
}
// Save the context.
Je ne suis pas trop sûr des étapes B et C. Toute aide serait appréciée. Merci.
L'avertissement du compilateur est à l'étape C: –
OK. Juste pour mieux comprendre cela: ce que je fais est d'insérer un nouvel objet dans l'entité (étape A), puis d'ajouter l'objet dans l'ensemble dans la relation d'une entité (étape C)? –
mon commentaire sur l'étape C devrait corriger l'avertissement du compilateur. oui vous ajoutez un nouvel objet au contexte et après l'ajoutez à une relation (ensemble) au besoin –