58 votes

Le moyen le plus rapide de vérifier si un objet existe dans Core Data ou non?

Je veux voir si un objet est persistet dans Core Data ou non. Par exemple, j'ai des amis dans Core Data et je les identifie par prénom. Je peux interroger les données de base pour voir si "George" est connu. Si le tableau d'ensemble de résultats contient plus que zéro objets, je sais que George est là. Mais Core Data charge le tout en mémoire et je veux juste savoir si George est stocké ou non.

Comment pourrais-je le faire de la manière la plus efficace?

99voto

Massimo Cafaro Points 18759

L'installation d'une Base de Données de la demande et, au lieu de l'émission de la requête, procédez de la manière suivante:

NSError *error = nil;
NSUInteger count = [managedObjectContext countForFetchRequest:request
                                                        error:&error];
if (!error) {
    return count;
} else {
  return 0;
}

Dans la pratique, la méthode de countForFetchRequest:error: retourne le nombre d'objets d'une demande de récupération serait revenu si elle avait été adoptée à l' executeFetchRequest:error:.


Edit: (par Regexident)

Comme Josh Caswell correctement commenté, la bonne façon de gérer les erreurs est soit ceci:

if (count == NSNotFound) {
    NSLog(@"Error: %@", error);
    return 0;
}
return count;

ou cela (sans journalisation des erreurs):

return (count != NSNotFound) ? count : 0;

25voto

shaikh Points 488

Oui, définitivement, il existe une meilleure méthode. Configurez une demande d’extraction comme d’habitude, mais au lieu de l’exécuter, demandez simplement le nombre d’objets qu’elle aurait renvoyés si elle avait été passée à executeFetchRequest: error:

Cela peut être fait en utilisant

 - (NSUInteger)countForFetchRequest:(NSFetchRequest *)request error:(NSError **)error;
 

Quelque chose comme ça:

 - (int) numberOfContacts{

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSManagedObjectContext *managedObjectContext = yourManagedObjectContext;
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contacts" inManagedObjectContext:managedObjectContext];
    [request setEntity:entity];

    NSError *error = nil;
    NSUInteger count = [managedObjectContext countForFetchRequest:request error:&error];
    [request release];

    if (!error){
        return count;
    }
    else
        return -1;

}
 

6voto

Jon Points 2102

Selon la Base de Données de la Documentation, vous ne devriez pas garder telechargement pour voir si l'existence d'objets.

Il y a beaucoup de situations où vous avez besoin de trouver des objets existants (objets déjà enregistré dans un magasin) pour un ensemble discret de valeurs en entrée. Une solution simple est de créer une boucle, puis pour chaque valeur exécute ensuite une extraction pour déterminer s'il existe une correspondance d'un objet persisté et ainsi de suite. Ce modèle ne prend pas en compte de l'échelle. Si vous le profil de votre application avec ce modèle, vous trouvez généralement l'extraction d'être l'un des plus chers des opérations dans la boucle (comparativement à une itération sur une collection d'éléments). Pire encore, ce modèle tourne un O(n) problème en un temps O(n^2) problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X