Say you have a Core Data object called Workshop. It has a to-many relationship to a Student object.
How would I create an NSArray of the students within the Workshop?
These relationships are normally declared as an NSSet
in your NSManagedObject subclass, like this:
@property (retain) NSSet* students;
And there's also some special accessor methods:
- (void)addStudentsObject:(NSManagedObject *)value;
- (void)removeStudentsObject:(NSManagedObject *)value;
- (void)addStudents:(NSSet *)value;
- (void)removeStudents:(NSSet *)value;
NSSets are similar to NSArrays, but they are not ordered, since Core Data does not guarantee a special sort order for managed objects.
It's a NSSet opposed to an array, as they are unordered.
Use mutableSetValueForKey: This returns a proxy that mutates the relationship and does KVO notifications. Think of the name as "[NS]MutableSet" "valueForKey" rather than "mutableSetValue" "forKey", because it returns a mutable set that you manipulate
NSMutableSet *Students; Students = [Workshop mutableSetValueForKey: @"Students"]; [Students addObject: newStudent]; [Students removeObject: oldStudent];
You usually have no need to create an array of a to-many relationship because they automatically come in a NSSet anyway. This gives better flexibility than an array.
However, if you need students sorted in a particular order you can use a sort descriptor to return a sorted array. Suppose you already have the WorkShop instances and you wanted an array of students sorted by last name in descending order, you would use this:
WorkShop *aWorkShop=//... fetch the appropiate WorkShop instances
NSSortDescriptor *sort=[NSSortDescriptor sortDescriptorWithKey:@"lastName" ascending:NO];
NSArray *sortedStudents=[aWorkShop.students sortedArrayUsingDescriptors:[NSArray arrayWithObject:sort]];