iphone uitableview core-data nspredicate nsfetchedresultscontroller

iphone - NSFetchedResultsController: ¿cambio de predicado no funciona?



uitableview core-data (3)

Estoy escribiendo una aplicación con dos tablas en una pantalla. La tabla de la izquierda es una lista de carpetas y la tabla de la derecha muestra una lista de archivos. Al tocar en una fila a la izquierda, la tabla derecha mostrará los archivos que pertenecen a esa carpeta.

Estoy usando Core Data para el almacenamiento. Cuando la selección de la carpeta cambie, el predicado de búsqueda del NSFetchedResultsController de la tabla correcta cambiará y realizará una nueva búsqueda, luego volverá a cargar los datos de la tabla. Utilicé el siguiente fragmento de código:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list = %@",self.list]; [fetchedResultsController.fetchRequest setPredicate:predicate]; NSError *error = nil; if (![[self fetchedResultsController] performFetch:&error]) { NSLog(@"Unresolved error %@, %@", error, [error userInfo]); abort(); } [table reloadData];

Sin embargo, los resultados de búsqueda siguen siendo los mismos . Tengo NSLog''ed "predicado" antes y después de la búsqueda, y estaban correctos con la información actualizada. Los resultados de búsqueda permanecen igual que la búsqueda inicial (cuando se carga la vista).

No estoy muy familiarizado con la forma en que Core Data recupera los objetos (¿hay un sistema de almacenamiento en caché?), Pero he hecho cosas similares antes (cambio de predicados, recuperación de datos y actualización de la tabla) con vistas de tabla únicas y todo fue bien.

Si alguien pudiera darme una pista, sería muy apreciado.

Gracias por adelantado.


En mi caso, la respuesta de Deafgreatdane no funciona; lo que hice en cambio es probablemente ingenuo, pero funciona:

  • crear predicado (s) correspondiente (s) en el método configureCell:atIndexPath: llamado en tableView:cellForRowAtIndexPath:
  • luego llame:
    [_fetchedResultsController.fetchRequest setPredicate:predicate];
    [_fetchedResultsController performFetch:nil];
  • consulte el objeto devuelto llamando a [self.fetchedResultsController objectAtIndexPath:indexPath]

Esto funcionó para mí:

[NSFetchedResultsController deleteCacheWithName:nil]; [self.fetchedResultsController.fetchRequest setPredicate:predicate]; NSError *error = nil; if (![self.fetchedResultsController performFetch:&error]) { NSLog(@"%@, %@", error, [error userInfo]); abort(); }


Tenía casi exactamente este problema, hasta que encontré la pista en una publicación de blog muy reciente en la incubadora de iphone

NSFetchedResultsController está almacenando en caché los primeros resultados. (Es probable que tenga algo configurado en initWithFetchRequest: managedObjectContext: sectionNameKeyPath: cacheName)

Supongo que su código (como el mío) es una derivación del ejemplo de CoreData, por lo que, suponiendo que sea @ "Root", antes de cambiar el predicado, haga una

[NSFetchedResultsController deleteCacheWithName:@"Root"];