0
votes

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?

3

3 Answers

2
votes

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.

1
votes

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];

source

1
votes

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]];