2011-06-13 19 views
30

Supongamos que tengo un modelo de datos básicos con una entidad abstracta llamada "Animal". Entonces, tengo muchas otras entidades que heredan de esta entidad abstracta: "León", "Perro", "Gato", etc. (No estoy desarrollando un programa de zoológico, pero esta analogía funciona bien para el problema que estoy explicando !)Datos principales: entidad abstracta en la solicitud de obtención

Lo que yo quiero saber es: ¿Puedo ir a buscar "todos los animales" a la vez haciendo esto:

NSFetchRequest *searchRequest = [[NSFetchRequest alloc] init]; 
[searchRequest setEntity:[NSEntityDescription entityForName:@"Animal" inManagedObjectContext:aContext]]; 

NSArray *matchedObjects = [aContext executeFetchRequest:searchRequest error:nil]; 

entiendo que hay métodos en NSEntityDescription para determinar si una entidad hereda de otra. ¿Pero hay una forma rápida de captar todas las entidades que son de un tipo particular (abstracto) --- en este caso, "Animal"?

Si el enfoque anterior no es válido, ¿cuál es la forma más eficiente de hacerlo? ¡Gracias!

Respuesta

31

Puedes definitivamente utilizar ese enfoque.

De Apple Core Data Programming guide (vaya a la sección inferior del artículo):

Si define una jerarquía de entidad herencia (ver “Entidad de herencia”), cuando se especifica un super-entidad como la entidad de una solicitud de recuperación, la solicitud devuelve todas las instancias coincidentes de la super entidad y de las subentidades. En algunas aplicaciones, puede especificar que una súper entidad sea abstracta (consulte "Entidades abstractas"). Para obtener instancias coincidentes de todas las subentidades concretas de la entidad abstracta, establece que la entidad para la especificación de búsqueda sea la entidad abstracta. En el caso del dominio descrito en "Resumen de entidades", si especifica una solicitud de recuperación con la entidad gráfica, la recuperación devuelve instancias coincidentes de círculo, área de texto y línea.

+0

¡Gracias! (Mis disculpas por perder esa parte de los documentos. Después de unas horas, todos comienzan a funcionar juntos.) – Bryan

+0

[Esta] (http://stackoverflow.com/a/6920736/832111) respuesta me hace creer que "Entidad Herencia "no es la elección correcta para eso. –

+0

@ d.ennis La pregunta aquí fue "¿Puedo buscar" todos los animales "a la vez ...", no "¿Puedo hacer que todas mis entidades hereden de una entidad abstracta" global "en mi modelo? La herencia de la entidad tiene su uso justo y puede ser muy útil. Abusar de ella puede hacerte perder esas ventajas. – octy

2

He hecho algo similar, pero esa entidad no era abstracta. Era una entidad estándar (sin instancias) y las otras entidades que obtuve se derivaron todas de esa entidad. No he probado con una clase abstracta, sin embargo, mirando a los documentos, parece que tal vez no sea posible:

Core Data Programming Guide

entidades abstractas se puede especificar que una entidad abstracta, que es es decir, que no creará ninguna instancia de esa entidad. Por lo general, realiza un resumen de entidad si tiene un número de entidades que representan todas las especializaciones de (heredar de) una entidad común que no debería instanciarse a sí mismo . Por ejemplo, en una aplicación de dibujo puede tener una entidad gráfica que define los atributos para las coordenadas xey, el color y los límites de dibujo . Nunca, sin embargo, instancia un gráfico. Las subentidades concretas de de Graphic podrían ser Circle, TextArea, y Line.

Mi sugerencia sería establecer las cosas con la entidad Animal abstracta y darle una oportunidad. Si no funciona, simplemente haz que la entidad Animal no sea abstracta (las palabras me fallan, ¿así es como lo llamaríamos? Tal vez 'concreto' es mejor?) Y deberías estar bien. Si alguien ha hecho esto con una clase abstracta, me gustaría escucharlo.

Cuestiones relacionadas