2010-12-12 11 views
5

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?

+0

Come è stato implementato * cleanName *? Sembrerebbe una proprietà transitoria per l'entità sarebbe la strada da percorrere. – Huperniketes

+0

Sono abbastanza sicuro che le proprietà transitori non possano essere utilizzate per l'ordinamento in NSFetchedResultsControllers. – samvermette

risposta

3

Dopo aver parlato con un paio di persone, sembra che salvare il "cleanName" nel database sia il modo migliore per andare e che "la normalizzazione sia sopravvalutata".

+1

Apple consiglia questa soluzione anche nella sessione WWDC 2010 118: Mastering dei dati principali –

+0

Buono a sapersi. Grazie. – samvermette