Dado el siguiente ejemplo artificioso:Consulta para todos los objetos de varios tipos de entidades infantil en la base de datos
me gustaría consultar mis datos para todos los objetos que son gatos o perros. Quiero que el conjunto de resultados esté ordenado por nombre, independientemente de la especie, por lo que ir a buscar a todos los gatos y luego buscar a todos los perros no servirá. Quiero hacer esto en una sola consulta.
Una forma de hacer esto sería añadir un campo petType para mascotas, dar a cada registro un valor petType que identifica el sub-entidad que pertenece, entonces se le pregunta de esta manera:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Pet"
inManagedObjectContext:myMOC];
[fetchRequest setEntity:entity];
// petType values: 1 = dog, 2 = cat, 3 = goldfish. Yuk.
NSPredicate *p = [NSPredicate predicateWithFormat:@"petType = 1 OR petType = 2"]
[fetchRequest setPredicate:p];
// etc...
Pero el mero pensar en hacerlo de esa manera me hace estremecer. ¿Hay una mejor manera?
actualización: Gracias a todos los que han respondido - hay algunos muy buenos, bien pensadas soluciones aquí y agradezco a todos ellos.
Para dar un poco de contexto, el modelo de datos real es un poco más complejo que esto (¿no es así?), Pero está bastante bien organizado. He diseñado más de mi parte de esquemas de datos en mi tiempo y estoy feliz de que las entidades y sus relaciones sean bien consideradas. Este problema se ha producido porque (para extender el ejemplo artificial ya inestable) el cliente originalmente quería:
- una vista que muestra una lista de todas las mascotas
- una vista que muestra una lista de peces de colores
- una vista que muestra una lista de los gatos
- una vista que muestra una lista de los perros
Hasta ahora, todo bien. Pero también quieren una vista que muestre una lista combinada de todos los gatos y perros "porque a las niñas les gustan los gatos y los perros". (Inicialmente se trataba de gatos y peces dorados, por la misma razón). No hay realmente una forma de agrupar de forma natural ese subconjunto de las entidades concretas; es realmente bastante arbitrario.
Hasta ahora, el enfoque de "entidad intermedia abstracta" de Dave Dribin parece ser la solución más limpia, aunque en mi caso creo que se sentiría algo artificial; ¡Realmente la única forma en que podría etiquetar con veracidad a la entidad intermedia sería como "ThingLittleGirlsLike"! :)
+1 La mayoría de las veces, problemas como este resultan del diseño deficiente del modelo. En este caso, parecería que los objetos de mascotas estarían relacionados con otra cosa (actualmente indefinida), p. un dueño. Si tiene una relación de propietario, puede pedir las mascotas del propietario y listo. Los modelos de datos pueden ser muy complejos y debes aprovecharlos para modelar/simular de cerca los objetos, condiciones y eventos del mundo real que tu aplicación maneja. Una vez que haces eso, generalmente encuentras que tus géneros, predicados y búsquedas se simplifican automáticamente. – TechZen
Gracias! Mi ejemplo artificial solo va tan lejos como para reflejar mi caso de uso del mundo real, pero la idea de la entidad intermedia FourLeggedPet me funcionaría bien, creo. ('includesEntities' es' SÍ' por defecto, por cierto, no es necesario configurarlo.) –
@SimonWhitaker, en mi caso, me gustaría obtener todas las subentidades (GoldFish, gatos y perros), pero filtrar los gatos en función de la "maldad". ¿Hay alguna manera de lograr eso? Estoy usando un fetchedresultsController, así que tengo que establecer un fetchRequest. – akshaynhegde