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.
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
Oui, je crois que j'ai fait quelques erreurs. J'ai mis à jour le post pour le rendre clair. – Mustafa
Cela semble fonctionner maintenant! Je ne suis pas sûr de ce qui a changé! – Mustafa