What is the best way to sort a Core Data Entity?

Solutions Collect From Internet About “What is the best way to sort a Core Data Entity?”

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#>"
[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"<#Sort key#>"
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


<#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"
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"
NSSortDescriptor *sortBySalary = [[NSSortDescriptor alloc] initWithKey:@"salary"
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortByName, sortBySalary, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

Hope that helps.


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.