What is the best way to sort a Core Data Entity?
arrays, core-data, ios, xcode
Solution
Your question is quite general but I'll try to give you some hints.
When you use `NSFetchRequest` class you can specify sort descriptors.
From Apple doc:
An array of sort descriptors (instances of `NSSortDescriptor`) that specify how the returned objects should be ordered, for example by last name then by first name.
Here you can find a simple example within Core Data Snippets doc
NSManagedObjectContext *context = <#Get the context#>;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>"
inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#Sort key#>"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
// Handle the error
}
// release allocated objects if you don't use ARC
Where
<#Entity name#> is the name of the entity you want to retrieve, e.g. `Manager`.
<#Sort key#> is the name of the key the request will use to order, e.g. `name` is an attribute of `Manager` entity.
So, in my example:
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByName, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
Since `setSortDescriptors:` sets an array of sort descriptors, you can specify multiple keys against you want to order. e.g. specify to order against `name` and `salary`. The sort descriptors are applied in the order in which they appear in the sortDescriptors array. So, in my example, first by `name` and then by `salary`.
So, in my example, it could become
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"name"
ascending:YES];
NSSortDescriptor *sortBySalary = [[NSSortDescriptor alloc] initWithKey:@"salary"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByName, sortBySalary, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
Hope that helps.
Edit
Since `fetchedObjects` contains `NSManagedObject` (I suppose you did not change the result type of your request) you need to iterate like the following:
for(NSManagedObject* currentObj in fetchedObjects) {
NSLog(@"Print the name %@", [currentObj valueForKey:@"name"]);
}
So, you need to access attributes or relationships through Key Value Coding. To make your life easier you could think to create `NSManagedObject` subclasses for the entities you created like organising-core-data-for-ios.
Problem
I have a fully working core data model, but when I return the data using a fetch request, it's in a seemingly random order. What is the best way to sort this data? Is it to use another table in the Core Data model, and 'query' the first? Or would it be to pull down the data into an array, and sort it that way? I'm not too sure how to do either of these, which is the reason that I am asking this question.