• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Die Bildungsoffensive hier im Forum geht weiter! Jetzt sollen Kreativität und technische Möglichkeiten einen neue Dimension erreichen. Das Thema in diesem Monat lautet - Verkehrte Welt - Hier geht es lang --> Klick

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.