2009-09-01 13 views
6

Umieszczam NSFetchedResultsController w moim kodzie, więc dostaję to ładne automatyczne cięcie moich danych widoku tabeli.Jak poprawnie skonfigurować NSFetchedResultsController

Przeprowadzam test, aby upewnić się, że wszystko działa poprawnie. Mam jeden obiekt Book w moim stałym magazynie. Najpierw wykonam stary sposób, a potem spróbuję użyć NSFetchedResultsController. Różnica między 2 blokami kodu wynosi zaledwie 2 linie.

Kod bez 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]; 

Teraz zastąpił w linii dla NSFetchedResultsController:

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

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

wydaje się dość cięte i suche. Pierwszy blok kodu prawidłowo pobiera jednostkę Single Book. Kod z NSFetchedResultsController, jednak nie. Zamiast tego zwraca zero.

Moje pytanie brzmi: czy poprawnie skonfigurowałem NSFetchedResultsController w tym przykładzie?

(uwaga, obiekt fetchedObjects z NSFetchedResultsController jest również zerowa)

Odpowiedz

13

Chyba trzeba jeszcze powiedzieć NSFetchedResultsController faktycznie wykonywać fetch:

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

(zaczerpnięte z przykładu w NSFetchedResultsController odniesienie)

jeszcze jedna rzecz, która wydaje się dziwna: czy naprawdę chcesz użyć "tytuł" jako sectionNameKeyPath? czy w zasadzie nie stworzy to osobnej sekcji dla każdej książki?

+0

Organizacja "tytułowa" to tylko test do jej uruchomienia. Właściwie chcę podzielić według klucza ścieżkę od nazwiska autorów, ale chcę, aby działał na prostym przykładzie. –

+0

To bardzo smutne, że tak naprawdę nie wykonałem pobrania. Nie wiem, dlaczego założyłem, że pobieranie zostało wykonane przy inicjalizacji. Dzięki –

+0

dzięki, że mi pomóc :) – mateusmaso

7

Trzeba zainicjować NSFetchedResultsController tylko raz, jak follows.The kod zakłada

NSFetchedResultsController *fetchedResultsController; 
NSManagedObjectContext *managedObjectContext; 

są zadeklarowane w nagłówku kontrolerze, a managedObjectContext jest już właściwie zainicjowana.

- (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; 
}  
Powiązane problemy