2010-10-14 972 views
7

Quiero agrupar los resultados de un NSFetchRequest por entidad. Todas las entidades comparten el mismo padre abstracto. Por ejemplo:¿Es posible ordenar por subclases en una `NSFetchRequest` sin agregar atributos adicionales?

animal 
| 
|-cat 
| 
|-dog 

El NSFetchRequest ha includesSubentities establecer TRUE y entity conjunto a animal. Es posible establecer sectionNameKeyPath de NSFetchedResultsController en entity.name pero no es posible hacer lo mismo con sortDescriptors del NSFetchRequest debido a que el sortDescriptors se aplica a los atributos almacenados (es decir, datos en la base de datos, no métodos en las clases) Por lo tanto, la única forma de agrupar por tipo de entidad es agregar un atributo a la superclase que las subclases puedan usar para identificarse.

Esto parece una locura ya que socava la utilidad de la herencia. Eché un vistazo a la base de datos SQLite y el tipo de entidad se almacena en la misma tabla que los atributos, por lo que los datos requeridos ya están en su lugar.

En resumen: ¿Es posible ordenar por subclases en un NSFetchRequest sin agregar atributos adicionales?

+0

¿Alguna vez encontró una respuesta a esta pregunta? – epologee

+0

@epologee. No, no he encontrado una solución. Creo que lo mejor que puede hacer es volver a ordenar 'fetchedResultsController.sections' o no usar' NSFetchedResultsController'. –

+0

He recurrido al uso de varias instancias NSFetchedResultsController, una para cada entidad: S. Favorito la pregunta si alguna vez alguien encuentra una respuesta. Aclamaciones. – epologee

Respuesta

2

Creo que la respuesta es no.

Obtenido y clasificación ocurre en la tienda (para la tienda SQLLite), por lo que los atributos deben ser parte del modelo de datos. Desde la guía de programación de datos básicos (características de tienda persistente):

Existen algunas interacciones entre la obtención y el tipo de tienda. En los almacenes XML, binarios y en memoria, la evaluación del predicado y las descripciones de clasificación se realiza en Objective-C con acceso a todas las funciones de Cocoa, incluidos los métodos de comparación en NSString. El almacén SQL, por otro lado, compila el predicado y clasifica las descripciones en SQL y evalúa el resultado en la base de datos. Esto se hace principalmente para el rendimiento, pero significa que la evaluación ocurre en un entorno que no es de Cacao, por lo que los descriptores de clasificación (o predicados) que se basan en Cocoa no pueden funcionar.

también

Además no se puede clasificar en propiedades transitorias utilizando el almacén de SQLite.

Cuestiones relacionadas