2010-10-14 19 views
7

Je veux regrouper les résultats d'un NSFetchRequest par entité. Les entités partagent toutes le même parent abstrait. Par exemple:Est-il possible de trier par sous-classes dans un NSFetchRequest sans ajouter d'attributs supplémentaires?

animal 
| 
|-cat 
| 
|-dog 

Le NSFetchRequest a includesSubentities mis TRUE et entity ensemble à animal. Il est possible de définir sectionNameKeyPath de NSFetchedResultsController sur entity.name mais il n'est pas possible de faire la même chose avec sortDescriptors du NSFetchRequest en raison du fait que les sortDescriptors sont appliqués aux attributs stockés (ie les données dans la base de données, pas les méthodes sur les classes). Par conséquent, la seule façon de regrouper par type d'entité est d'ajouter un attribut à la superclasse que les sous-classes peuvent utiliser pour s'identifier.

Cela semble fou car il mine l'utilité de l'héritage. J'ai jeté un oeil dans la base de données SQLite et le type d'entité est stocké dans la même table que les attributs de sorte que les données requises sont déjà en place.

En résumé: Est-il possible de trier par sous-classes dans un NSFetchRequest sans ajouter d'attributs supplémentaires?

+0

Avez-vous déjà trouvé une réponse à cette question? – epologee

+0

@epologee. Non, je n'ai pas trouvé de solution. Je pense que la meilleure chose à faire est soit de re-trier 'fetchedResultsController.sections' ou ne pas utiliser' NSFetchedResultsController'. –

+0

J'ai utilisé plusieurs instances NSFetchedResultsController, une pour chaque entité: S. Favorisé la question si jamais quelqu'un trouve une réponse à cela. À votre santé. – epologee

Répondre

2

Je pense que la réponse est non.

La fonction Extraire et trier se produit dans le magasin (pour le magasin SQLLite). Les attributs doivent donc faire partie du modèle de données. A partir du guide de programmation de données de base (Persistent Store Features):

Il existe certaines interactions entre la récupération et le type de magasin. Dans les mémoires XML, binaires et en mémoire, l'évaluation des descripteurs de prédicat et de tri est effectuée en Objective-C avec accès à toutes les fonctionnalités de Cocoa, y compris les méthodes de comparaison sur NSString. Le magasin SQL, d'autre part, compile les descripteurs de prédicat et de tri à SQL et évalue le résultat dans la base de données elle-même. Cela se fait principalement pour les performances, mais cela signifie que l'évaluation se produit dans un environnement autre que Cocoa et que les descripteurs de tri (ou prédicats) qui dépendent de Cocoa ne peuvent pas fonctionner.

également

En outre, vous ne pouvez pas trier sur les propriétés transitoires en utilisant le magasin de SQLite.