Question

Je rencontre un problème étrange lorsque j'essaie de compter les entités dans un contexte d'objet géré.

- (NSUInteger)countEntity:(NSString *)entityName 
                inContext:(NSManagedObjectContext *)context{

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName                     
                                                  inManagedObjectContext:context];
    [request setEntity:entity];
    [request setIncludesSubentities:NO];
    NSError *error = nil;
    NSUInteger count = [context countForFetchRequest:request error:&error];
    [request release];
    return count;
}

La ligne:

NSUInteger count = [context countForFetchRequest:request error:&error];

renvoie une raison NSInternalInconsistencyException: "entité introuvable"

Passage à:

NSUInteger count = [[context executeFetchRequest:request error:&error] count];

fonctionne sans problème.

Je suis perdu ici. Des idées?

Merci!

/ Oskar

Était-ce utile?

La solution

Courir dans ce aujourd'hui. Commencé quand j'ai introduit un deuxième magasin persistant. Avez-vous plus d'un magasin dans le moc? -Ken

Autres conseils

Pour ce que cela vaut, je viens de rencontrer un bogue similaire où executeFetchRequest: error et countForFetchRequest: error: ne sont pas d’accord sur le nombre d’objets dans le chercher la requête.

Le scénario est que j'ai imbriqué NSManagedObjectContexts avec un contexte racine de type NSPrivateQueueConcurrencyType (pour l'enregistrement sur disque), sauvegardé par un magasin persistant et un enfant de ce type avec < code> NSMainQueueConcurrencyType (à utiliser par l'interface graphique). (Oui, j'utilise MagicalRecord)

J'ai un ViewController écoutant NSManagedObjectContextDidSaveNotification à partir du contexte "principal". Lorsque cette notification est déclenchée, la méthode countForFetchRequest: error: n'inclut pas les modifications apportées dans le contexte qui n'ont pas été enregistrées dans le contexte racine parent. executeFetchRequest: erreur renvoie toutefois l'ensemble d'objets attendu.

Peu bizarre.

Vérifiez plusieurs choses:

  1. Quelle est la valeur de erreur après le premier appel? La raison pour laquelle vous transmettez cet objet est d’obtenir des informations lorsque les choses tournent mal.
  2. Quelle est la valeur de [entité de requête] après le premier appel? Je suis peut-être complètement désemparé, mais je me souviens très vaguement de ce qu'une requête est un accord ponctuel: une fois que vous l'exécutez, vous devez réinitialiser tous les champs avant de pouvoir l'exécuter à nouveau. Assurez-vous que toutes les propriétés de votre demande sont toujours valides après le premier appel ou, mieux encore, créez une seconde instance NSFetchRequest pour effectuer le second appel.
  3. Dans le même ordre d'idées, que se passe-t-il si vous commentez le premier appel? Si vous changez l'ordre des appels? Le résultat de l'un pourrait en affecter un autre.

Je soupçonne que entité est nil (c'est-à-dire que contexte est nul ou n'a pas de coordinateur de stockage persistant correctement configuré avec un modèle d'objet géré contenant votre entité, ou vous avez mal orthographié le nom de l’entité quelque part dans le modèle d’objet ou dans le code appelant). Vérifiez que entité n'est pas nil après l'appel à + [NSEntityDescription entityForName: inManagedObjectContext:] .

J'ai exécuté votre méthode countEntity: dans l'un de mes propres projets et tout s'est bien déroulé. La seule façon dont je pouvais l'obtenir en lançant une exception ("_countWithNoChangesForRequest: erreur: une requête d'extraction doit avoir une entité.") Était lorsque j'ai mal saisi le nom de l'entité (widgets au lieu de Widgets). Donc, vous voudrez peut-être enquêter dans cette direction.

Le problème rencontré est dû à une mauvaise utilisation de countForFetchRequest: error :. En effet, dans votre extrait de code, vous exécutez d’abord la demande d’extraction à l’aide de executeFetchRequest: error, puis passez à countForFetchRequest: error:.

À partir de la documentation de la méthode:

Renvoie le nombre d'objets qu'une demande d'extraction donnée aurait renvoyée si elle avait été passée à executeFetchRequest: error:.

Par conséquent, vous ne devez PAS exécuter la demande d'extraction avant d'appeler countForFetchRequest: error:.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top