Comment faire pour récupérer uniquement le premier enregistrement dans la Base de Données?
Je suis en utilisant la Base de Données et je ne veux extraire le premier enregistrement dans mon dataset, est-il possible?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
setFetchLimit:
méthode sur NSFetchRequest de limiter le nombre d'enregistrements récupérés. Donc, si vous voulez seulement le premier enregistrement:Noter que l'appel à
executeFetchRequest:error:
retournera toujours un NSArray, vous avez toujours besoin de tirer sur le premier objet dans le tableau avant de vous pouvez travailler avec elle, même si c'est un tableau de taille 1.L'autre, de moins en moins efficace méthode: en Fonction de votre type de magasin, en limitant l'extraction peut produire de la performance théâtrale de la vitesse. Si elle n'est pas, cependant, ou vous n'êtes pas inquiet au sujet de la performance, et vous pouvez utiliser plus de données, plus tard, vous pouvez simplement tirer sur le premier objet dans le tableau à l'avance:
Si vous êtes sûr que le tableau est un objet, vous pouvez même obtenir dans un autre array (pour une utilisation dans un UITableViewController, par exemple) en faisant ceci:
-firstObject
et alerter sur les-subarrayWithRange:
appel.Bien sûr, il partiellement dépend de ce que vous entendez par le "premier enregistrement". Vous ne pouvez pas seulement besoin de définir le parcours de la limite à 1, mais aussi pour trier les résultats de l'extraction.
Par exemple, j'ai un tas de
User
objets dans ma base de données, et je veux trouver le premier qui a créé un compte. (En supposant que j'ai déjà le modèle pourUser
, y compris un attribut nomméaccountCreatedDate
.)Si vous n'avez pas trier les résultats avant de limiter le chercher, il n'y a pas à dire ce que les résultats seront retournés "première".
J'ai utilisé Objective-C catégories d'ajouter un
NSManagedObject
méthode de classe, appeléefirstInManagedObjectContext:
.Code Source
D'utilisation
Ajouter ces fichiers à votre projet et assurez-vous de les lier à votre cible. Ensuite,
#import "NSManagedObject+Additions.h"
dans le.m
fichiers lorsque vous utilisez lefirstInManagedObjectContext:
méthode de classe.Appeler depuis n'importe quel béton (non abrégé) sous-classe de
NSManagedObjectContext
. Il suffit de passer leNSManagedObjectContext *context
à partir de laquelle pour aller chercher de l'objet géré. La méthode détecte les(NSString *)entityName
à partir du nom de la classe à laquelle elle est appelée. Rappelez-vous juste de jeter le résultat d'une construction propre (sans mises en garde).Je suis en utilisant ce pour un objet géré de classe dont je sais que je n'ai qu'une sauvés de l'instance. Si vous avez plus d'un sauvés exemple, vous souhaiterez peut-être ajouter un
NSSortDescriptor
comme @Craig McMahon suggère. Vous pouvez également essayer de trier parobjectID
au lieu deaccountCreatedDate
si tous les objets sont créés sur le même appareil. Je ne suis pas sûr, toutefois, si l'Id d'objet sont commandés.Exemple
Imaginez que vous avez un
Event
objet qui descend deNSManagedObjectContext
. Vous pourriez faire:Blocs
Après la lecture de la Pragmatique du Studio iOS 4 Blocs de Tutoriel, j'ai réalisé que ce code pourrait être améliorée et rendue encore plus modulaire en ajoutant une autre fonction, l'appeler
+ fetch
et l'ajout d'unNSFetchRequestBlock
(qui devrait prendre lafetchRequest
comme argument) &NSFetchRequestFailureBlock
comme arguments pour personnaliser la demande de récupération et le traitement de la demande de récupération d'erreur, respectivement. Je vous mets au défi de s'attaquer à ce! 🙂Il suffit de régler le
fetchLimit
propriété de votreNSFetchRequest
à 1, puis ramasser le premier élément à partir des résultatsNSArray
à l'aide de lafirstObject
méthode pour éviter touteindex out of bound for empty array
erreur.Voici l'exemple de code :
C'est une tentative de ma part.
N. B. le Livre de l'Entité hérite de NSManagedObject.
Bang cette statique de la classe helper appelé CoreDataHelper