• Das kreative Thema des Monats Oktober wird vor allem diejenigen unter Euch besonders ansprechen, denen Do-it-yourself quasi im Blut liegt. Zeigt uns Eure Improvisationskünste oder fotografiert, was andere Leute sich so im Alltag zusammengestrickt haben. --> Zum Mitmachen bitte hier klicken

CoreData: Sortieren nach String-Länge

  • Ersteller Ersteller Mitglied 7974
  • Erstellt am Erstellt am

Mitglied 7974

Gast
Hallo, zusammen!

Ich habe eine Frage zu Core Data: Wie sortiert man in Core Data nach der Länge eines String-Attributs innerhalb eines NSManagedObjects? Ich will dasselbe erreichen, wie wenn man in einer SQL-Datenbank eine Spalte nach String-Länge sortiert:
Code:
SELECT TheStringAttribute FROM MyTable ORDER BY LENGTH(TheStringAttribute) ASC;

Mein Ansatz wäre gewesen, dem zu erstellenden NSFetchRequest einen entsprechenden NSSortDescriptor hinzuzufügen, der folgendermaßen erzeugt wird:

Code:
NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"TheStringAttribute.length" ascending:YES];

Xcode meckert nicht und führt das so erstellte Request auch aus, aber als Resultat bekomme ich eine lediglich alphabetisch sortierte Liste.

Daher habe ich im zweiten Ansatz versucht, Core Data über einen NSComparator klar zu machen, was ich eigentlich will:

Code:
NSSortDescriptor *descriptor = 
    [[NSSortDescriptor alloc] initWithKey:@"TheStringAttribute" ascending:YES comparator:^(id str1, id str2) {
        if ([str1 length] < [str2 length])
        {
            return (NSComparisonResult)NSOrderedAscending;
        }
        else if ([str1 length] > [str2 length])
        {
            return (NSComparisonResult)NSOrderedDescending;
        }
        else
        {
            return (NSComparisonResult)NSOrderedSame;
        }
    }];

Das liefert mir allerdings wiederum nur eine alphabetisch sortierte Liste zurück. Die String-Länge wird erneut ignoriert.

Was mache ich also falsch? Wo und was habe ich bei Core Data falsch verstanden? Kann man mit Core Data überhaupt nach der Länge eines String-Attributs sortieren?

Danke
Matthias
 
Weiß niemand Rat?

Es gäbe ja freilich noch den Ansatz, mir einfach die Datensätze unsortiert als NSArray zurückliefern zu lassen und das Array dann selber zu sortieren (was auch funktioniert). Das ist für mich aber keine Option, denn nachdem es sich hier um eine extrem große Datenbank handelt und die App auf dem iPhone laufen soll (3G), muss ich mit einem Fetch Limit arbeiten, um die Geschwindigkeit und den Speicherverbrauch nicht auf eine harte Probe zu stellen. Durch die Limitierung würden nicht diejenigen Datensätze erfasst, die ich benötige (hab ich schon getestet). Daher MUSS die Sortierung geschehen BEVOR ich NSArray-Zugriff auf die Datensätze habe.