2010-03-26 13 views
10

Digamos que tengo una tienda de padres de hijos y el padre tiene una relación uno a muchos con hijos (padres.niños) y todos tienen nombres. Ahora, en la búsqueda inicial para padres, puedo especificar un descriptor de ordenación para volver a ordenarlos por orden de nombre, pero ¿cómo puedo solicitarlos en orden? Si hago un [parent.children allObjects], simplemente los devuelve en un revoltijo y tendré que ordenar el hecho una y otra vez.Datos básicos, ordenando objetos secundarios de uno a muchos

Gracias, Sam

Respuesta

11

Sam,

Si leo bien su pregunta, desea establecer una zona de alcance que devuelve una lista ordenada de los hijos de un padre específico. Para ello, me gustaría establecer una extracción de entidades "niños" y luego usar un predicado para limitar los resultados:

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:[NSEntityDescription entityForName:@"children" inManagedObjectContext:moc]]; 
[request setSortDescriptors:[NSArray initWithObject:[[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:YES]]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"(parent == %@)", parent]]; 

Obviamente, su entidad y los nombres de atributos pueden ser diferentes. En la última línea, la variable padre debe ser una referencia a la instancia NSManagedObject del padre cuyos hijos desea.

+0

veo, que estás sugiriendo correr una zona de alcance en lugar de usar el fallo en coredata? ¿Es eso menos eficiente? es decir, ¿configurar una búsqueda con el predicado y ejecutarlo es más costoso que solo hacer [parent.children allObjects] y dejar que el managedObject complete la falla? – Shizam

+0

Creo que tiene razón en que ejecutar una nueva solicitud de recuperación será más lento que llenar el fallo con [parent.children allObjects] y luego ordenar el NSArray que obtenga. En mi opinión, la ventaja de una nueva solicitud de recuperación es que podría usar un NSFetchedResultsController para mantener el conjunto de resultados actualizado y ordenado (es decir, si crea un nuevo hijo del padre, lo insertará automáticamente en la lista de resultados) . Si planea mantener la lista de niños por un período prolongado y la lista podría cambiar (es decir, si está mostrando una lista editable), utilizaría esta estrategia. –

16

Si lo que desea es utilizar un NSArray, y no un NSFetchedResultsController, hay otra manera:

NSSortDescriptor *alphaSort = [NSSortDescriptor sortDescriptorWithKey:@"firstName" ascending:YES]; 
NSArray *children = [[parent.children allObjects] sortedArrayUsingDescriptors:[NSArray arrayWithObject:alphaSort]]; 
+0

Shosti: ¿la llamada de 'allObjects' en la relación de muchos asegura que todos los objetos en esa relación tienen fallas y ahora están en la memoria si no lo estaban anteriormente? A veces, la entidad padre se busca sin relaciones de obtención ansiosas, y luego, queremos que todos los elementos secundarios (to-related objects) estén presentes. Me pregunto si eso garantiza que siempre se dispararán todas las fallas en esa relación en particular. – idStar

Cuestiones relacionadas