2009-10-23 8 views
3

Je rencontre un problème étrange lorsque je tente de compter les entités dans un contexte d'objet géré.CoreData countForFetchRequest indique 'entité non trouvée'

- (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]; 

jette un NSInternalInconsistencyException reason: 'entity not found'

Changer à:

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

fonctionne sans aucun problème.

Je suis à la perte ici. Des idées?

Merci!

/Oskar

Répondre

4

Courir dans ceci aujourd'hui. Commencé à se produire lorsque j'ai introduit un deuxième magasin persistant.Avez-vous plus d'un magasin dans le moc? -Ken

+1

Arrêt de l'obtention de l'erreur à l'aide de setAffectedStores: sur la demande pour le pointer vers le magasin configuré pour contenir l'entité. Un bug ou est-ce que je ne comprends pas le but de la configuration? –

+0

Je crois que vous avez résolu le problème! J'avais en effet plusieurs magasins. – Oskar

+0

Puisque le fetch normal fonctionne et que le compte échoue, je dirais que ça doit être un bug, hein? –

0

Vérifiez plusieurs choses:

  1. Quelle est la valeur de error après le premier appel? La raison pour laquelle vous passez dans cet objet est d'obtenir des informations lorsque les choses tournent mal. Quelle est la valeur de [request entity] après le premier appel? Je suis peut-être complètement éteint, mais je me souviens très vaguement de quelque chose à propos d'une demande d'un coup unique: une fois que vous l'avez exécuté, vous devez réinitialiser tous les différents 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 deuxième instance NSFetchRequest pour effectuer le second appel.
  2. Dans la même veine, 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.
+0

1. Je ne sais pas si je peux évaluer l'erreur car l'exception me jette hors du contexte. 2. J'ai commencé à n'appeler que [contexte countForFetchRequest: erreur de requête: & error]; et c'était quand j'ai connu le problème. Les commandes executeFetchRequest et array.count ont été uniquement lancées pour vérification de cohérence. 3. selon 2 – Oskar

-1

Le problème que vous rencontrez est dû à une mauvaise utilisation de countForFetchRequest: erreur:. En effet, dans votre fragment de code, vous devez d'abord exécuter la requête d'extraction en utilisant executeFetchRequest: error, puis procéder à l'utilisation de countForFetchRequest: error :.

De la documentation de la méthode:

Renvoie le nombre d'objets a donné FETCH aurait retourné si elle avait été adoptée à executeFetchRequest: erreur :.

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

+0

J'ai réalisé que je confondais la question en ayant à la fois countForFetchRequest et executeFetchRequest en même temps dans mon exemple. Je ne les ai jamais exécutés tous les deux en même temps. J'essayais seulement de montrer que l'un fonctionnait, et l'autre non. – Oskar

0

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

+0

Ce n'est pas nul. Et executeFetchRequest fonctionne où countForFetchRequest échoue. – Oskar

+0

Dans ce cas, vous avez peut-être trouvé un bogue de Core Data. Si vous pouvez reproduire ceci dans un projet séparé avec un minimum de code, vous devez absolument soumettre un bug sur bugreport.apple.com. –

0

J'ai exécuté votre méthode countEntity: dans un de mes propres projets et il s'est bien déroulé. La seule façon dont je pouvais l'obtenir pour lancer une exception ("_countWithNoChangesForRequest: error: Une requête de recherche doit avoir une entité.") Était quand j'ai mis-mis en majuscule le nom de l'entité (widgets à la place Widgets). Donc, vous pourriez vouloir enquêter dans cette direction.

+0

Je tripple vérifié le nom de l'entité, et comme executeFetchRequest fonctionne bien, le nom est très probablement correct. Je peux vivre sans compter puisque c'est uniquement pour le but de débogage. Ce qui m'inquiète cependant, c'est qu'il y a un problème sous-jacent dans mon xcdatamodel qui viendra me mordre un peu plus tard. – Oskar

1

Pour ce que ça vaut Je viens à travers un bug similaire où executeFetchRequest:error et countForFetchRequest:error: ne sont pas d'accord sur le nombre d'objets dans la requête d'extraction.

Le scénario est que j'ai imbriqué NSManagedObjectContexts avec un contexte racine de type NSPrivateQueueConcurrencyType (pour l'enregistrement sur le disque) soutenu par un magasin persistant et un enfant de ce NSMainQueueConcurrencyType avec le type (pour une utilisation par l'IUG). (Oui, j'utilise MagicalRecord)

J'ai un ViewController en écoute NSManagedObjectContextDidSaveNotification du contexte 'main'. Lorsque cette notification se déclenche, la méthode countForFetchRequest:error: n'inclut pas les modifications apportées au contexte qui n'ont pas été enregistrées dans le contexte racine parent. executeFetchRequest:error renvoie cependant l'ensemble attendu d'objets.

Bit wierd.

Questions connexes