NSFetchedResultsController avec NSPredicate non mis à jour

J'obtiens des données d'une database de base et les présente dans un UITableView . J'utilise un NSFetchedResultController pour récupérer datatables. Je veux que l'user puisse searchr dans la database, et pour ce faire j'utilise un NSPredicate .

Les données sont présentées dans UITableView et tout fonctionne bien jusqu'à ce que je mette NSPredicate à NSFetchedResultController .

Je l'utilise dans la méthode ViewDidLoad :

  self.fetchedResultsController = nil; fetchedResultsController_ = nil; NSError *error = nil; if (![[self fetchedResultsController] performFetch:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); exit(-1); } 

et quand l'user a entré un text de l' UITextField , ce text ira au nouveau NSPredicate .

Ceci est fait quand la search commence:

 NSPredicate *pred = nil; pred = [NSPredicate predicateWithFormat:@"(Designation BEGINSWITH '22')"]; [fetchedResultsController_.fetchRequest setPredicate:pred]; NSError *error = nil; if (![[self fetchedResultsController] performFetch:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); exit(-1); } [tView reloadData]; 

En ce moment j'utilise @"(Designation BEGINSWITH '22')" pour les tests seulement.

C'est mon NSFetchedResultsController:

  - (NSFetchedResultsController *)fetchedResultsController { if (fetchedResultsController_ != nil) { return fetchedResultsController_; } /* Set up the fetched results controller. */ // Create the fetch request for the entity. NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; // Edit the entity name as appropriate. NSEntityDescription *entity = [NSEntityDescription entityForName:@"Product" inManagedObjectContext:importContext];//self.managedObjectContext [fetchRequest setEntity:entity]; // Set the batch size to a suitable number. [fetchRequest setFetchBatchSize:20]; // Edit the sort key as appropriate. NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Designation" ascending:NO]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [fetchRequest setSortDescriptors:sortDescriptors]; // Edit the section name key path and cache name if appropriate. // nil for section name key path means "no sections". NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:importContext sectionNameKeyPath:nil cacheName:@"Root"]; //self.managedObjectContext aFetchedResultsController.delegate = self; self.fetchedResultsController = aFetchedResultsController; [aFetchedResultsController release]; [fetchRequest release]; [sortDescriptor release]; [sortDescriptors release]; return fetchedResultsController_; } 

Le problème est que datatables récupérées restnt les mêmes, peu importe comment ou si je définis un prédicat. Si je devais définir un prédicat dans viewDidLoad cela fonctionnerait, mais je ne serais pas capable d'get de nouveaux résultats si j'avais recommencé. J'utilise un " importContext " pour une import par lots de mes CoreData.

Des idées?

Merci d'avance!

MISE À JOUR: Ok, voici ce que j'ai découvert. J'ai un importContext où je fais un batch-import. Et pour le fetchController j'utilise self.managedObjectContext . C'est pourquoi ça ne marche pas, donc je dois faire self.managedObjectContext avoir les mêmes choses que mon importContext quelque sorte …

Vous utilisez un cache (@ "Root") … Essayez de le définir à zéro, cela pourrait éviter les plantages. Vous ne devez pas mettre en cache FetchedResultsControllers destiné à être prédictif.

Mieux vaut que définir le cache à nil lui donne un nom unique. Après avoir posté cette question iPhone – Nom du cache pour NSFetchedResultsController J'ai ajouté une fonction pour générer des UUID comme noms de cache.