Ho un gruppo di artisti memorizzati in CoreData e voglio ordinarli per nome ma ignorando il prefisso "the". Per esempio "The Beatles" sarebbe stato classificato come "Beatles", un po 'come quello che fa iTunes/iPod.NSSortDescriptor per rimuovere il prefisso "the"
Così ho provato ad aggiungere una proprietà personalizzata cleanName
al mio modello di artista in modo che possa essere utilizzato per l'ordinamento con:
NSSortDescriptor *sortByName = [[NSSortDescriptor alloc] initWithKey:@"cleanName" ascending:YES];
che porta ovviamente verso il basso l'applicazione come cleanName
non è una proprietà del SQLEntity:
...keypath cleanName not found in entity <NSSQLEntity Artist id=1>
So che potrei salvare cleanName nello store, ma a me sembra sbagliato. Un nuovo attributo solo per avere il nome spogliato del prefisso "the"? Veramente?
Così, invece, ho cercato sottoclasse NSSortDescriptor con un compareObject personalizzato: ToObject: implementazione:
- (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];
}
Questo funziona quando aggiungo un nuovo artista, dicono "The Beatles" al mio deposito. L'artista è classificato come "Beatles" e viene visualizzato all'interno della mia sezione "B". Ma non appena ho lasciato l'applicazione e rilanciarlo, ottengo il seguente errore e tableView soggiorni appena vuoto:
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'
Come si può vedere da quello che sto la registrazione, i titoli delle sezioni vanno bene (The Beatles 'titolo della sezione è B, come dovrebbe essere). Ma l'ordinamento è rotto, dato che questo record dovrebbe essere giusto prima di "Bonobo".
Qualche idea su come risolvere questo problema?
Come è stato implementato * cleanName *? Sembrerebbe una proprietà transitoria per l'entità sarebbe la strada da percorrere. – Huperniketes
Sono abbastanza sicuro che le proprietà transitori non possano essere utilizzate per l'ordinamento in NSFetchedResultsControllers. – samvermette