2010-10-03 5 views
0

Je connais très bien les habitudes d'utilisation des données de base, mais je suis récemment tombé sur un problème: Imaginez un cas simple où j'ai une entité de personne, avec deux attributs de chaîne. Je veux faire un UITableView trié par noms et divisé en sections par nom de l'entreprise. Un son assez simple:Données de base: changements à la section

... 
personFetchController_ = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                  managedObjectContext:mainDataCenter.managedObjectContext 
                   sectionNameKeyPath:@"company" 
                     cacheName:@"PersonListCache"];  
NSError *error = nil; 
if (![personFetchController_ performFetch:&error]) 
{ 
    LogError(@"Error fetching persons: %@", [error localizedDescription]); 
} 
personFetchController_.delegate = self; 

je me inscrire en tant que délégué à l'écoute des changements, notamment les changements aux sections:

- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo 
      atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type 
{ 
    NSIndexSet *sections = [NSIndexSet indexSetWithIndex:sectionIndex]; 
    switch (type) 
    { 
     case NSFetchedResultsChangeInsert: 
      [personTableView_ insertSections:sections withRowAnimation:UITableViewRowAnimationFade]; 
      break; 
     case NSFetchedResultsChangeDelete: 
      [personTableView_ deleteSections:sections withRowAnimation:UITableViewRowAnimationFade]; 
     default: 
      break; 
    } 
} 

Il fonctionne très bien quand je ajouter/supprimer/modifier le nom d'une personne , mais si je change le nom de la société (ce qui signifie de passer d'une section à l'autre), l'application se bloque, en disant après une insertion, le nombre de lignes dans la section doit être l'ancienne valeur plus un.

Tout le monde a bien compris?

Répondre

0

Le code qui conduit à ce crash n'est probablement pas dans cette méthode.

S'il vous plaît afficher le code de cette méthode:

-(void)controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: 

surtout comment réagissez-vous à des changements avec un type de NSFetchedResultsChangeMove?

dans l'Apple Documentation pour NSFetchedResultsControllerDelegate ils utilisent cela pour didChangeObject: ...

case NSFetchedResultsChangeMove: 
     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 
     [tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] 
        withRowAnimation:UITableViewRowAnimationFade]; 
     break; 

Avant que j'ai découvert que l'Apple documentation contient presque tout le code nécessaire pour NSFetchedResultsController je un code à partir du Web , Je suppose de certains tutoriel, qui a causé un accident à des occurrences rares. Après un certain temps, j'ai découvert que je pouvais déclencher cela en déplaçant le seul et unique objet dans la première section (qui sera supprimé) à la deuxième section (qui sera la nouvelle première section).

Depuis lors, j'ai lu et recherché Apple-Documentation avant de lire les didacticiels ^^

Questions connexes