2 votes

Filtrer NSFetchedResultsController pour supprimer les objets ayant le même nom

Ces objets sont uniques, à l'exception de deux colonnes, dont l'une est utilisée pour l'affichage dans le UITableView. Pour cette raison, l'UITableView affiche souvent des doublons. J'ai besoin de filtrer ces doublons d'une manière ou d'une autre.

La définition de distinctResult sur le FetchResult ne fonctionne pas dans ce cas, car cela limite la fonctionnalité du NSFetchedResultsController et exige que le REsultType soit un NSDictionary au lieu d'une sous-classe d'objet géré.

Personne n'a une idée de la façon dont je peux filtrer ces doublons à l'aide d'un prédicat ? N'oubliez pas que chaque champ de ces objets est unique, sauf pour deux d'entre eux.

-(NSFetchedResultsController *) fetchGroupedObjects:(NSString *)entityDescription 
                                      sortField:(NSString *)sortField 
                                     withPredicate:(NSPredicate *)predicate  {

BPRAppDelegate *delegate = (BPRAppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = delegate.managedObjectContext;
//NSError *error;

//Fetch the data....
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription 
                               entityForName:entityDescription inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSSortDescriptor *groupDescription = [[NSSortDescriptor alloc]
                                    initWithKey:GROUP_NAME ascending:YES];
//Sort by Category Name
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]
                                    initWithKey:sortField ascending:YES];

NSMutableArray *sorts = [[[NSMutableArray alloc] init] autorelease];

[sorts addObject:sortDescriptor];
[sorts addObject:groupDescription];

[fetchRequest setSortDescriptors:sorts];
//[fetchRequest setResultType:NSDictionaryResultType];
//[fetchRequest setPropertiesToGroupBy:[entity.propertiesByName valueForKey:CONTRACTOR_NAME];

if (predicate != nil)
  [fetchRequest setPredicate:predicate];

//NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

//NSFetchResultsController

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *fetchedResultsController = 
[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
                                    managedObjectContext:context sectionNameKeyPath:GROUP_NAME 
                                               cacheName:nil]; //Don't use a cache
 [fetchRequest release];
 [sortDescriptor release];
 [groupDescription release];
 return fetchedResultsController; //You can't autorelease this thing... the requestor must  do that.

}

0voto

Scott Corscadden Points 2009

Bien qu'il puisse être plus facile de mettre en place une relation optionnelle to-one vers lui-même (disons, "child") de sorte que vous puissiez ensuite récupérer avec un NSPredicate où "child == nil", vous pouvez certainement post-filtrer assez facilement en C objectif pur en utilisant [array enumerateObjectsUsingBlock:] ou équivalent, et n'ajoute au tableau résultant que les objets uniques correspondant à vos critères.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X