Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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.

like image 876
Alex Godbehere Avatar asked Jul 22 '12 13:07

Alex Godbehere


People also ask

What is entity core data?

An entity describes an object, including its name, attributes, and relationships.

What class would you use to filter fetched results from core data?

Core Data fetch requests can use predicates in SwiftUI just like they can with UIKit, all by providing a predicate property to your @FetchRequest property wrapper. If you followed my Core Data and SwiftUI set up instructions, you've already injected your managed object context into the SwiftUI environment.

What is Nsfetchrequest?

A description of search criteria used to retrieve data from a persistent store.

What is Nssortdescriptor?

An immutable description of how to order a collection of objects according to a property common to all the objects.


1 Answers

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.

like image 196
Lorenzo B Avatar answered Sep 19 '22 12:09

Lorenzo B