CoreData to-many ajoute une erreur

Je ne sais pas ce que je fais mal ici.

L'école a un to-many pour Student, et Student a son inverse. entrez la description de l'image ici


entrez la description de l'image ici


Un petit code de test comme suit:

@class Student; @interface School : NSManagedObject @property (nonatomic, retain) NSSsortingng * name; @property (nonatomic, retain) NSOrderedSet *students; @end @interface School (CoreDataGeneratedAccessors) - (void)insertObject:(Student *)value inStudentsAtIndex:(NSUInteger)idx; - (void)removeObjectFromStudentsAtIndex:(NSUInteger)idx; - (void)insertStudents:(NSArray *)value atIndexes:(NSIndexSet *)indexes; - (void)removeStudentsAtIndexes:(NSIndexSet *)indexes; - (void)replaceObjectInStudentsAtIndex:(NSUInteger)idx withObject:(Student *)value; - (void)replaceStudentsAtIndexes:(NSIndexSet *)indexes withStudents:(NSArray *)values; - (void)addStudentsObject:(Student *)value; - (void)removeStudentsObject:(Student *)value; - (void)addStudents:(NSOrderedSet *)values; - (void)removeStudents:(NSOrderedSet *)values; @end // Meanwhile, elsewhere... -(void)go { AppDelegate *app = (AppDelegate *)[[UIApplication sharedApplication] delegate]; NSManagedObjectContext *context = [app managedObjectContext]; School *school = (School *)[NSEntityDescription insertNewObjectForEntityForName:@"School" inManagedObjectContext:context]; [school setName:@"Stanford"]; Student *student = (Student *)[NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context]; [student setName:@"Eric"]; //[school addStudentsObject:student]; NSMutableSet *students = [school mutableSetValueForKey:@"students"]; [students addObject:student]; NSError *__autoreleasing error; BOOL success = [context save:&error]; if (!success) { @throw [NSException exceptionWithName:NSGenericException reason:[error description] userInfo:nil]; } } 

L'utilisation du commentaire addStudentsObject: échoue avec:

 2013-04-13 16:22:58.648 CDTMTest[2098:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSSet intersectsSet:]: set argument is not an NSSet' *** First throw call stack: (0x1fa2012 0x13dfe7e 0x2030a4a 0xb85ec6 0xb087f9 0xb85d33 0x11aa638 0x7ee2069 0x2b4d 0xacd5b3 0x1f61376 0x1f60e06 0x1f48a82 0x1f47f44 0x1f47e1b 0x1efc7e3 0x1efc668 0x13ffc 0x1bdd 0x1b05) libc++abi.dylib: terminate called throwing an exception 

L'utilisation de mutableSetValueForKey: échoue avec

 2013-04-13 16:07:05.111 CDTMTest[2012:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'NSManagedObjects of entity 'School' do not support -mutableSetValueForKey: for the property 'students'' *** First throw call stack: (0x1fa3012 0x13e0e7e 0x11370da 0x3af3 0xace5b3 0x1f62376 0x1f61e06 0x1f49a82 0x1f48f44 0x1f48e1b 0x1efd7e3 0x1efd668 0x14ffc 0x2b7d 0x2aa5) libc++abi.dylib: terminate called throwing an exception 

Vous pouvez essayer ceci pour append à un set:

 mutableOrderedSetValueForKey: 

Comme tu l'as choisi to-many relation à order. mais je crois qu'il sera plus facile pour vous de simplement définir la relation dans l'autre sens:

 student.school = school; 

J'avais un problème similaire. J'ai lu quelque part que l'implémentation de base des données de base pour les relations trop nombreuses ne fonctionne pas correctement tout le time. Cela a quelque chose à voir avec le fait que la relation n'accepte qu'un nsset et que les setters générés ne convertissent pas correctement les arguments entrants en nsset. Pour résoudre ce problème, essayez de surcharger la méthode addStudentsObject: avec quelque chose comme ceci:

 static NSSsortingng *const kItemsKey = @"students"; - (void)addStudentsObject:(Student *)value { NSMutableSet* tempSet = [NSMutableSet setWithSet:self.students]; NSSet* newObject = [NSSet setWithObject:value]; [self willChangeValueForKey:kItemsKey withSetMutation:NSKeyValueUnionSetMutation usingObjects:newObject]; [tempSet addObject:value]; self.students = tempSet; [self didChangeValueForKey:kItemsKey withSetMutation:NSKeyValueUnionSetMutation usingObjects:newObject]; }