2010-08-11 5 views
0

J'ai un à plusieurs relations d'entité entre deux entités:NSFetchResultsController + sectionNameKeyPath + section pour

EntityP (Parent) <-->> EntityC (Child) 

Attributs et relations:

EntityP.title 
EntityP.dateTimeStamp 
EntityP.PtoC (relationship) 

EntityC.title 
EntityC.dateTimeStamp 
EntityC.CtoP (relationship) // Can be used to get "one" EntityP record 

-je utiliser chercher contrôleur de résultats pour afficher les résultats. Voici ma mise en œuvre des fonctions de recherche contrôleur de résultats:

#pragma mark - 
#pragma mark Fetched results controller 

- (NSFetchedResultsController *)fetchedResultsController { 
    // Set up the fetched results controller if needed 
    if (fetchedResultsController != nil) { 
      return fetchedResultsController; 
    } 

    // Create the fetch request for the entity 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

    // Set Entity 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityC" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    // Set Predicate 
    // (Ignore, we want to get list of all EntityC records) 

    // Set Sort Descriptors (sort on Parent - for section, and then on Child - for rows) 
    NSSortDescriptor *sortDescriptorPDate = [[NSSortDescriptor alloc] initWithKey:@"CtoP.dateTimeStamp" ascending:YES]; 
    NSSortDescriptor *sortDescriptorDate = [[NSSortDescriptor alloc] initWithKey:@"dateTimeStamp" ascending:YES]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptorPDate, sortDescriptorDate, nil]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 
    [fetchRequest setFetchBatchSize:20]; 

    // Create and initialize the fetch results controller 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"CtoP.title" cacheName:nil]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    // Cleanup memory 
    [aFetchedResultsController release]; 
    [fetchRequest release]; 
    [sortDescriptorPDate release]; 
    [sortDescriptorDate release]; 
    [sortDescriptors release]; 

    NSError *error = nil; 
    if (![fetchedResultsController performFetch:&error]) { 
      /* 
      Replace this implementation with code to handle the error appropriately. 

      abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. If it is not possible to recover from the error, display an alert panel that instructs the user to quit the application by pressing the Home button. 
      */ 
      NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
      abort(); 
    } 

    return fetchedResultsController; 
}  

Maintenant, par exemple, si je l'ai données suivantes dans le magasin de persistance:

EntityP.dateTimeStamp EntityP.title EntityC.dateTimeStamp EntityC.title 
Today     B    Today     d 
Yesterday    A    Yesterday    a 
Today     B    Yesterday    c 
Yesterday    A    Today     b 

Note: hier et aujourd'hui est au format NSDate.

Alors je devrais obtenir les sections et les lignes dans l'ordre suivant (exactement):

A 
a 
b 

B 
c 
d 

Mais, le genre ne fonctionne pas comme ça. Je récupère les lignes dans le bon ordre, mais les sections ne sont pas commandées! J'espère que sortDescriptorPDate fait son travail. Qu'est-ce que je rate? Remerciant par anticipation.

+0

Je pense que vous avez quelque chose de mal à transcrire le code pour le poste. Je ne pense pas que ce que vous avez ici fonctionnera du tout. Est-ce que EntityP et EntityC sont des entités distinctes dans le modèle de données? Ils semblent avoir les mêmes propriétés et dans le code, vous semblez les traiter comme interchangeables. – TechZen

+0

Oui, je crois que j'ai fait quelques erreurs. J'ai mis à jour le post pour le rendre clair. – Mustafa

+0

Cela semble fonctionner maintenant! Je ne suis pas sûr de ce qui a changé! – Mustafa

Répondre

0

Cela semble fonctionner maintenant! Je ne suis pas sûr de ce qui a changé! - Mustafa Sep 6 '10 à 4:03

+0

Qu'est-il arrivé ??? – Siriss

0

Je ne sais pas, je comprends votre configuration, mais ...

Par défaut, les titres de section sont la première lettre en majuscule du nom de la section. Si vous voulez une des sections personnalisées telles que celles basées sur les dates, vous devez la sous-NSFetchedResultsController et passer outre les différentes méthodes sectionIndex... pour retourner les sections correctes, index et titres de sections de la section.

+0

Le problème n'est pas avec le titre de la section, c'est avec leur ordre de tri. – Mustafa