0

Je reçois un comportement inattendu avec CoreData et NSPredicate. Dans une population de base de données importante, j'ai différents objets gérés liés les uns aux autres. Cependant, j'ai un problème avec ce qui suit. Lorsque je donne un identifiant (NSNumber, donné comme NSString à cette fonction), je n'obtiens pas de résultat à moins que je ne sauvegarde d'abord le contexte entier. Je ne veux pas faire cela car cela prend trop de temps (car c'est un grand ensemble de données). Le code est:Recherche d'un ID dans les données de base

- (DOSite *) findSite:(NSString *) siteId { 
    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"(id = %@)", siteId]; 

    [NSFetchedResultsController deleteCacheWithName:nil]; 
    [[self fetchedResultsController].fetchRequest setPredicate:predicate]; 

    NSError *fetchError; 

    if (![[self fetchedResultsController] performFetch:&fetchError]) { 
     // Handle the error. 
     // This is a serious error and should advise the user to restart the application 
     NSLog(@"Fetching data error: %@", [fetchError localizedDescription]); 
    } 

    if([[[self fetchedResultsController] fetchedObjects] count] == 0){ 
     return NULL; 
    } 
    return (DOSite *)[[[self fetchedResultsController] fetchedObjects] objectAtIndex:0]; 
} 

Alors, quand j'ajouter un nombre x d'articles (en utilisant +[NSEntityDescription insertNewObjectForEntityForName:inManagedObjectContext:]) faisant une recherche sur tous les éléments renvoient la bonne quantité d'articles.

Lors de la recherche d'une chaîne (par exemple predicateWithFormat:@"(name LIKE %@)"), j'obtiens des résultats positifs, mais lorsque j'utilise le code predicateWithFormat:@"(id = %@) ci-dessus, j'obtiens zéro résultat. La seule façon dont je peux obtenir des résultats est de sauvegarder tout le contexte, puis d'exécuter fetchRequest, puis tout à coup cela fonctionne.

Donc, il doit y avoir quelque chose de petit que je fais mal dans la recherche de l'ID, je semble juste être aveugle pour le trouver et passer deux jours maintenant pour le réduire à ce point. Y a-t-il quelqu'un qui peut me donner un conseil à ce sujet?

Répondre

0

Le problème était que j'ai donné un NSString au prédicat comme indiqué ci-dessus. En changeant cela à un int (ie predicateWithFormat:@"(id == %i)") cela fonctionne bien pour une raison quelconque.

0

Cela peut ne pas fonctionner, mais avez-vous essayé d'utiliser un nom plus complexe que "id" dans votre entité (comme "SiteID")? Parfois, des noms très courts chevauchent d'autres propriétés du système et provoquent des problèmes étranges.

+0

Oui, c'est quelque chose à quoi je dois m'adapter en Objective-C. Ce n'était pas le problème dans ce cas, mais je vais le changer dans les communiqués de presse. Merci de l'avoir signalé! –

Questions connexes