12.03.2011

Suchergebnisse mit NSSortDescriptor sortieren

Ausgehend von dem Tutorial Simple Core Data Command Line Importer werden nun alle Core Data Datensätze ausgelesen und dann sortiert ausgegeben. Verwendet wird dafür der NSSortDescriptor.

Das verwendete Datenmodell sieht folgendermaßen aus:

Die folgende Abbildung zeigt, daß mittels eines NSFetchRequest und eines NSSortDescriptor die drei Datensätze aus der Persistenzschicht ausgelesen und anschließend sortiert auf der Konsole ausgegeben werden sollen.

In der Datei main.m wird die Methode searchAndPrintSorted() ergänzt:

void searchAndPrintSorted() {
    NSManagedObjectContext *context = managedObjectContext();
    
    //Use NSSortDescriptor
    NSSortDescriptor *personNameSort = [[NSSortDescriptor alloc] initWithKey:@"personname" ascending:YES];
    NSArray *sorters = [NSArray arrayWithObject:personNameSort];
    
    
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:[NSEntityDescription entityForName:@"Person" inManagedObjectContext:context]];
    [request setSortDescriptors:sorters];
    NSError *error = nil;
    
    NSArray *persons = [context executeFetchRequest:request error:&error];
    if(error) {
        NSLog(@"Cannot execute NSFetchRequest: %@", [error localizedDescription]);
        return ;
    }
    
    for(NSManagedObject *person in persons) {
        NSLog(@"Person: firstname: %@ lastname: %@", [person valueForKey:@"personfirstname"],[person valueForKey:@"personname"]);
    }
}

Der interessante Teil befindet sich in Zeile 5. Dort wird der NSSortDescriptor allokiert und initialisiert. Als Sortierkriterium wird der personname verwendet und es wird angegeben, daß das Ergebnis aufsteigend sortiert sein soll. Da die Methode setSortDescriptors des NSFetchRequest ein NSArray als Parameter erwartet, wird der NSSortDescriptor vor der Verwendung in ein Array gepackt.

Möchte man eine Liste mit Personen sortieren, bei der mehrere Personen den gleichen Nachnamen haben, gibt es die Möglichkeit einen weiteren NSSortDescriptor, der nach Vornamen sortiert, in das NSArray einzufügen. Damit würden die Personen mit gleichem Nachnamen anschließend noch nach dem Vornamen sortiert werden.