2009-11-23 5 views
5

J'ai une base de données d'événements chargée dans les données de base qui a des titres d'événements en double. Cela a été fait pour que la base de données puisse fournir des informations uniques pour chaque jour de l'événement. Par exemple, les fluctuations des prix à chaque date.Tri des données de base avec prédicat pour éliminer les doublons

Je dois maintenant supprimer les titres d'événements en double d'une liste qui sera affichée en vue de table avec NSFetchRequest et NSPredicate pour fournir le filtre. Mais tous les exemples que j'ai vus nécessitent une valeur de clé dynamique nulle pour être utilisée comme cible pour le filtre de prédicat. par exemple, NSDate ci-dessous fournit le temps maintenant comme un filtre de clé et cela fonctionne.

Actuellement, le titre NSString * cible une valeur dans la classe ManagedObject d'événements qui renvoie une valeur nulle. Voici un extrait du FetchResultsController.

- (NSFetchedResultsController *)fetchedResultsController { 
    if (fetchedResultsController == nil) { 
     NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; 
     NSPredicate *predicate = [[[NSPredicate alloc] init] autorelease]; 
     [fetchRequest setReturnsObjectsAsFaults:NO]; 
     [fetchRequest setEntity:[NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext]]; 
     NSArray *sortDescriptors = nil; 
     NSString *sectionNameKeyPath = nil; 
     NSDate *date = [NSDate date]; 
     NSString *title = [events title]; 
     if ([fetchSectioningControl selectedSegmentIndex] == 1) { 
      predicate = [NSPredicate predicateWithFormat:@"(closeDate >= %@) AND (title == %@)", date, title ]; 
      sortDescriptors = [NSArray arrayWithObjects:[[[NSSortDescriptor alloc] initWithKey:@"category.name" ascending:YES] autorelease], [[[NSSortDescriptor alloc] initWithKey:@"openDate" ascending:YES] autorelease], nil]; 
      sectionNameKeyPath = @"category.name"; 
     } else if ([fetchSectioningControl selectedSegmentIndex] == 0){ 
      predicate = [NSPredicate predicateWithFormat:@"closeDate >= %@", date]; 
      sortDescriptors = [NSArray arrayWithObject:[[[NSSortDescriptor alloc] initWithKey:@"openDate" ascending:YES selector:@selector(compare:)] autorelease]]; 
      sectionNameKeyPath = @"day"; 
     } 
     [fetchRequest setPredicate:predicate]; 
     [fetchRequest setSortDescriptors:sortDescriptors]; 
     fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:sectionNameKeyPath cacheName:@"EventsCache"]; 
    }  
    return fetchedResultsController; 
} 
+1

Même problème ici. –

Répondre

4

Vous pouvez définir

setReturnsDistinctResults:YES 

sur votre fetchRequest.

Pour plus, voir les docs: NSFetchRequest Class Reference

+1

Merci pour vos commentaires. Malheureusement, il y a plus de problèmes que de solutions à ce stade. Les résultats autant que je peux dire doivent être retournés comme un NSDictionary ainsi je perds une partie de leur fonctionnalité retournée comme objets gérés. c'est à dire. Les données ont également une relation avec une autre entité appelée «Catégorie» que je n'ai pas mentionnée auparavant, les appologies. Il définit les sections de chaque événement. – Jim

Questions connexes