2009-09-01 17 views
6

Estoy colocando NSFetchedResultsController en mi código, así que obtengo esa buena sección automática de los datos de mi vista de tabla.Cómo configurar correctamente NSFetchedResultsController

Estoy ejecutando una prueba para asegurarme de que todo funciona correctamente. Tengo una única entidad de Libro en mi tienda persistente. Primero realizaré la búsqueda al estilo anterior, luego intentaré usar NSFetchedResultsController. La diferencia entre los 2 bloques de código es solo 2 líneas.

Código sin NSFetchedResultsController:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:kBookEntityName inManagedObjectContext:self.managedObjectContext]; 
[request setEntity:entity]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
[sortDescriptor release]; 
[sortDescriptors release]; 

    //The following 2 lines will be replaced by the NSFetchedResultsController 
NSMutableArray *mutableFetchResults = [[[self.managedObjectContext executeFetchRequest:request error:nil] mutableCopy] autorelease]; 
Book *result = (Book*)[mutableFetchResults objectAtIndex:0]; 

NSString* title = [result valueForKey:@"title"]; 
NSString* priority = [result valueForKeyPath:@"priority.name"]; 


[request release]; 

Ahora suplente en las líneas para el NSFetchedResultsController:

NSFetchedResultsController* fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"title" cacheName:@"BookList"];                                                                           

Book *result = (Book*)[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 

parece bastante corta y seca. El primer bloque de código recupera correctamente la entidad de Libro individual. El código con NSFetchedResultsController, sin embargo, no. En cambio, devuelve nil.

Mi pregunta es: ¿estoy configurando adecuadamente NSFetchedResultsController en este ejemplo?

(nota, la propiedad fetchedObjects del NSFetchedResultsController también es nulo)

Respuesta

13

creo que todavía tienen que contar la NSFetchedResultsController para llevar a cabo realmente la tomará;

NSError *error; 
BOOL success = [controller performFetch:&error]; 

(tomado del ejemplo en el NSFetchedResultsController referencia)

otra cosa que parece extraña: ¿de verdad quieres usar "title" como sectionNameKeyPath? ¿No será eso básicamente crear una sección separada para cada libro?

+0

la organización del "título" es solo una prueba para ponerlo en funcionamiento. De hecho, quiero seccionar por una ruta clave sobre el nombre del autor, pero quiero que funcione con un simple ejemplo. –

+0

Eso es bastante triste porque no llevé a cabo la búsqueda. No sé por qué asumí que la búsqueda se realizó en la inicialización. Gracias –

+0

gracias, que me ayuden :) – mateusmaso

7

debe inicializar su NSFetchedResultsController sólo una vez, como follows.The código asume

NSFetchedResultsController *fetchedResultsController; 
NSManagedObjectContext *managedObjectContext; 

se declaran en la cabecera de su controlador, y que managedObjectContext ya se ha inicializado correctamente.

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     // Handle error 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 

    } 

    NSLog(@"%d objects fetched", [[fetchedResultsController fetchedObjects] count]); 
} 

- (NSFetchedResultsController *)fetchedResultsController { 

    if (fetchedResultsController != nil) { 
     return fetchedResultsController; 

    } 

    /* 
    Set up the fetched results controller. 
    */ 



    // Create the fetch request for the entity. 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:kBookEntityName inManagedObjectContext:self.managedObjectContext]; 
    [request setEntity:entity]; 

/* Optional settings 

    [request setResultType:NSManagedObjectResultType]; 
    [request setIncludesPropertyValues:YES]; 
    [request setIncludesPendingChanges:NO]; 
    [request setReturnsObjectsAsFaults:NO]; 
*/ 


    // Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
[sortDescriptor release]; 
[sortDescriptors release];; 

    // 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:request managedObjectContext:managedObjectContext sectionNameKeyPath:@"title" cacheName:@"BookList"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    [aFetchedResultsController release]; 
    [request release]; 


    return fetchedResultsController; 
}  
Cuestiones relacionadas