2009-05-20 3 views
2

J'ai une question basique. Supposons que vous ayez une demande NSFetchRequest que vous souhaitez effectuer sur un NSManagedObjectContext. Si la requête d'extraction n'a pas de descripteurs de tri définis explicitement, les objets seront-ils aléatoires à chaque fois, ou vont-ils être crachés dans un tableau dans l'ordre dans lequel ils ont été ajoutés au contexte d'objet géré initialement? Je ne trouve pas cette réponse nulle part dans la documentation.Les extractions de données de base (NSFetchRequest) sont-elles triées de façon spécifique par défaut?

Répondre

3

Non, ils ne sont pas garantis d'être commandés. Vous pourriez voir des commandes cohérentes selon le type de magasin de données que vous utilisez (je n'ai jamais essayé), mais ce n'est pas quelque chose dont vous devriez dépendre.

Cependant, il est facile de commander par date de création. Ajoutez simplement un attribut de date à votre entité, initialisez-le à la date actuelle dans awakeFromInsert, et spécifiez ce descripteur de tri dans votre recherche.

0

La commande peut ne pas être "aléatoire à chaque fois" mais pour autant que je sache, vous ne pouvez pas/ne devez pas en dépendre. Si vous avez besoin d'une commande spécifique, utilisez des descripteurs de tri.

0

Je vois deux questions ici: va-t-elle sortir dans le même ordre à chaque fois? Et, est-ce la commande sur ordre d'insertion?

Il sort dans l'ordre, ce qui est dans un certain ordre. Notez que NSSet n'est qu'une interface et que des classes privées implémentent NSSet. Cela signifie que si certaines instances de NSSet vous reviennent si vous appelez allObjects par rapport à elles, elles peuvent être retournées dans un ordre cohérent, c'est presque assurément dans un ordre de hachage car les ensembles sont presque universellement implémentés comme dictionnaires hachés. Puisque l'algorithme de hachage est très variable selon ce qui est stocké et comment il est haché, vous pourriez avoir de la chance qu'il apparaisse dans le même ordre à chaque fois, mais ensuite être pris au dépourvu quand quelque chose change très légèrement. Donc, techniquement, ce n'est pas vraiment aléatoire et ça pourrait être dans un ordre stable.

À la deuxième question, je dirais qu'il est presque assurément pas dans l'ordre d'insertion.

La suggestion de Marc pour gérer awakeFromInsert est une bonne chose, et ce que vous voulez.

0

Il n'y a aucune garantie sur la commande. Par exemple, je pourrais implémenter un NSAtomicStore ou NSIncrementalStore qui retourne les résultats dans un ordre aléatoire et ce serait complètement correct. J'ai vu le magasin SQLite retourner des commandes différentes sur différentes versions du système d'exploitation.

Questions connexes