2010-12-12 14 views
5

Ich habe eine Reihe von Künstlern in CoreData gespeichert und möchte sie nach Namen, aber ignorieren das Präfix "the". Zum Beispiel würden "The Beatles" als "Beatles" sortiert werden, ähnlich wie das, was iTunes/iPod macht. SoNSSortDescriptor zum Entfernen der "Präfix"

Ich habe versucht, eine benutzerdefinierte cleanName Eigenschaft meiner Künstler-Modell hinzugefügt, so dass es für die Sortierung mit verwendet werden:

NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"cleanName" ascending:YES]; 

, die offensichtlich nach unten bringt die App als cleanName ist nicht eine Eigenschaft des SQLEntity:

...keypath cleanName not found in entity <NSSQLEntity Artist id=1> 

Ich weiß, ich könnte den cleanName im Laden speichern, aber es scheint mir einfach falsch. Ein neues Attribut, nur um den Namen des "Präfix" zu entfernen? "Ja wirklich?"

Anstatt also habe ich versucht, NSSortDescriptor mit einem benutzerdefinierten compareObject Subklassen: toObject: Umsetzung:

- (NSComparisonResult)compareObject:(Artist*)artist1 toObject:(Artist*)artist2 { 

NSString *cleanString1 = [artist1.name stringByReplacingOccurrencesOfString:@"the " withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [artist1.name length])]; 
NSString *cleanString2 = [artist2.name stringByReplacingOccurrencesOfString:@"the " withString:@"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [artist2.name length])]; 

return [artist1.cleanName compare:artist2.cleanName options:NSCaseInsensitiveSearch]; 
} 

Dies funktioniert, wenn ich einen neuen Künstler hinzufügen, sagen: "The Beatles" zu meinem Speicher. Der Künstler ist als "Beatles" sortiert und wird in meinem "B" Abschnitt angezeigt. Aber sobald ich die App beenden und neu starten es, erhalte ich die folgende Fehlermeldung und die Tableview bleibt einfach leer:

sectionIndex A for Apparat 
sectionIndex B for Bonobo 
sectionIndex M for Misteur Valaire 
sectionIndex M for Moderat 
sectionIndex P for Paul Kalkbrenner 
sectionIndex R for Röyksopp 
sectionIndex B for The Beatles 
NSFetchedResultsController ERROR: The fetched object at index 6 has an out of order section name 'R. Objects must be sorted by section name' 

Wie Sie sehen können, was ich anmelden, die Abschnittstitel sind in Ordnung (The Beatles 'Titel der Sektion ist B, wie es sein sollte. Aber die Sortierung ist kaputt, da diese Aufzeichnung direkt vor "Bonobo" stehen sollte.

Eine Idee, wie Sie das beheben können?

+0

Wie haben Sie * cleanName * implementiert? Es würde scheinen, eine vorübergehende Eigenschaft für die Entität wäre der Weg zu gehen. – Huperniketes

+0

Ich bin mir ziemlich sicher, dass vorübergehende Eigenschaften nicht zum Sortieren in NSFetchedResultsControllers verwendet werden können. – samvermette

Antwort

3

Nach dem Chatten mit ein paar Leuten scheint es, als ob die Speicherung des "cleanName" in der Datenbank der beste Weg ist und dass "Normalisierung überbewertet wird".

+1

Apple empfiehlt auch diese Lösung in seiner WWDC 2010 Sitzung 118: Mastering Core Data –

+0

Gut zu wissen. Vielen Dank. – samvermette

Verwandte Themen