2010-12-12 13 views
5

Tengo un grupo de artistas almacenados en CoreData y quiero ordenarlos por nombre pero ignorando el prefijo "el". Entonces, por ejemplo, "The Beatles" se clasificaría como "Beatles", como lo que hace iTunes/iPod.NSSortDescriptor para quitar el "prefijo"

así que traté de añadir una propiedad personalizada cleanName a mi modelo del artista para que pueda ser utilizado para la clasificación con:

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

Eso, obviamente, hace bajar la aplicación como cleanName no es una propiedad de la SQLEntity:

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

Sé que podría guardar el cleanName en la tienda, pero me parece incorrecto. ¿Un nuevo atributo para tener el nombre despojado del prefijo "the"? De Verdad?

Así que en vez, me trataron como subclase NSSortDescriptor con un compareObject personalizado: toObject: aplicación:

- (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]; 
} 

Esto funciona cuando agrego un nuevo artista, por ejemplo "The Beatles" a mi tienda. El artista está clasificado como "Beatles" y se muestra dentro de mi sección "B". Pero tan pronto como sale de la aplicación y relanzarlo, me sale el siguiente error y el tableview sólo se queda vacío:

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' 

Como se puede ver en lo que estoy registro, los títulos de las secciones están bien (The Beatles 'título de la sección es B, como debería ser). Pero la clasificación está rota, ya que este registro debería estar justo antes de "Bonobo".

¿Alguna idea de cómo solucionar esto?

+0

¿Cómo implementó * cleanName *? Parecería una propiedad transitoria para la entidad sería el camino a seguir. – Huperniketes

+0

Estoy bastante seguro de que las propiedades transitorias no se pueden usar para ordenar en NSFetchedResultsControllers. – samvermette

Respuesta

3

Después de chatear con un par de personas, parece que guardar el "cleanName" en la base de datos es la mejor manera de hacerlo y que la "normalización está sobrevalorada".

+1

Apple también recomienda esta solución en su WWDC 2010 Sesión 118: Mastering Core Data –

+0

Es bueno saberlo. Gracias. – samvermette

Cuestiones relacionadas