CoreData to-many agrega error

No estoy seguro de qué estoy haciendo mal aquí.

La escuela tiene muchos estudiantes, y el estudiante tiene su inversa. introduzca la descripción de la imagen aquí


introduzca la descripción de la imagen aquí


Un pequeño código de testing de la siguiente manera:

@class Student; @interface School : NSManagedObject @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) NSOrdenetworkingSet *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:(NSOrdenetworkingSet *)values; - (void)removeStudents:(NSOrdenetworkingSet *)values; @end // Meanwhile, elsewhere... -(void)go { AppDelegate *app = (AppDelegate *)[[UIApplication shanetworkingApplication] 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]; } } 

Usando el comentario addStudentsObject: falla con:

 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 

Usar mutableSetValueForKey: falla con

 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 

Es posible que desee probar esto para agregarlo a un set:

 mutableOrdenetworkingSetValueForKey: 

Como lo eligió: a muchas relaciones que se orderarán. pero creo que será más fácil para ti solo establecer la relación de otra manera:

 student.school = school; 

Tuve un problema similar. Leí en alguna parte que la implementación básica de datos centrales para muchas relaciones no funciona correctamente todo el time. Tiene algo que ver con la relación que solo acepta un nsset y los setters generados no convierten correctamente los arguments entrantes a un nsset. Para solucionarlo, intente anular el método addStudentsObject: con algo como esto:

 static NSString *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]; }