- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
   Person *person = (Person *)[self.fetchedResultsController 
      objectAtIndexPath:indexPath];
   cell.textLabel.text = [person fullName];
}

- (void)insertNewObject
{ 
   // Utworzenie nowego egzemplarza encji zarzdzanego przez kontrolera o nazwie fetchedResultsController. 
   NSManagedObjectContext *context = [self.fetchedResultsController 
      managedObjectContext]; 
   NSEntityDescription *entity = [[self.fetchedResultsController fetchRequest] entity];
   Person *newManagedObject = (Person *)[NSEntityDescription 
      insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context];

   // Jeli istnieje potrzeba, przeprowad konfiguracj nowego obiektu zarzdzanego. Zwykle powiniene stosowa metody 
   // akcesora, ale uycie mechanizmu KVC pozwala unikn koniecznoci dodawania nowej klasy do szablonu.
   [newManagedObject setFirstName:@"Jan"];
   [newManagedObject setLastName:@"Kowalski"];

   // Zapis kontekstu.
   NSError *error = nil;
   if (![context save:&error])
   { 
      /* 
      Zastp t implementacj kodem, ktry prawidowo obsuguje bdy.
      Funkcja abort() powoduje zakoczenie dziaania aplikacji i wygenerowanie odpowiedniego pliku dziennika. Ta funkcja nie powinna by uywana w ostatecznej wersji aplikacji, cho moe by uyteczna podczas prac nad aplikacj. Jeeli nie bdzie moliwoci kontynuowania dziaania po wystpieniu bdu, aplikacja wywietli uytkownikowi komunikat informujcy o koniecznoci zakoczenia dziaania aplikacji poprzez nacinicie przycisku Pocztek. 
      */ 
      NSLog(@"Wystpi bd niemoliwy do usunicia %@, %@", error, [error userInfo]); 
      abort(); 
   }
}

- (NSFetchedResultsController *)fetchedResultsController 
{
   if (__fetchedResultsController != nil)
   {
      return __fetchedResultsController;
   }
   /*
   Konfiguracja kontrolera fetchedResultsController.
   */ 
   // Utworzenie dania pobrania encji.
   NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
   // Podanie odpowiedniej nazwy encji.
   NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person"
      inManagedObjectContext:self.managedObjectContext];

   [fetchRequest setEntity:entity];

   // Ustalenie odpowiedniej liczby pobieranych elementw.
   [fetchRequest setFetchBatchSize:20];

   // Ustalenie odpowiedniego klucza sortowania.
   NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"lastName" 
      ascending:YES];
   NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

   [fetchRequest setSortDescriptors:sortDescriptors];

   // Edycja sectionNameKeyPath oraz cacheName. Warto nil
   // dla sectionNameKeyPath oznacza "brak sekcji".
   NSFetchedResultsController *aFetchedResultsController = 
      [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                          managedObjectContext:self.managedObjectContext
                                            sectionNameKeyPath:nil
                                                     cacheName:@"Root"];
   aFetchedResultsController.delegate = self;
   self.fetchedResultsController = aFetchedResultsController;

   [aFetchedResultsController release];
   [fetchRequest release];
   [sortDescriptor release];
   [sortDescriptors release];

   NSError *error = nil;
   if (![self.fetchedResultsController performFetch:&error])
   {
      /* 
      Zastp t implementacj kodem, ktry prawidowo obsuguje bdy.
      Funkcja abort() powoduje zakoczenie dziaania aplikacji i wygenerowanie odpowiedniego pliku dziennika. Ta funkcja nie powinna by uywana w ostatecznej wersji aplikacji, cho moe by uyteczna podczas prac nad aplikacj. Jeeli nie bdzie moliwoci kontynuowania dziaania po wystpieniu bdu, aplikacja wywietli uytkownikowi komunikat informujcy o koniecznoci zakoczenia dziaania aplikacji poprzez nacinicie przycisku Pocztek. 
      */ 
      NSLog(@"Wystpi bd niemoliwy do usunicia %@, %@", error, [error userInfo]); 
      abort(); 
   } 
   return __fetchedResultsController; 
}
