2009-11-23 8 views
5

Ich habe eine Event-Datenbank in Core Data geladen, die doppelte Event-Titel enthält. Dies wurde gemacht, damit die Datenbank einzigartige Informationen für jeden Tag der Veranstaltung bereitstellen kann. ZB Preisschwankungen an jedem Datum.Sortieren von Core-Daten mit Prädikat zum Eliminieren von Duplikaten

Ich muss jetzt die doppelten Ereignistitel aus einer Liste entfernen, die als Tabellenansicht mit NSFetchRequest und NSPredate angezeigt werden, um den Filter bereitzustellen. Aber alle Beispiele, die ich gesehen habe, erfordern einen nicht dynamischen Schlüsselwert, der als Ziel für den Prädikatfilter verwendet werden kann. zB unter NSDate stellt die Zeit jetzt als Schlüsselfilter zur Verfügung und es funktioniert.

Momentan zielt NSString * title auf einen Wert in der ManagedObject-Klasse der Ereignisse, der einen Nullwert zurückgibt. Hier ist ein Ausschnitt aus dem 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

Das gleiche Problem hier. –

Antwort

4

könnten Sie

setReturnsDistinctResults:YES 

auf fetchRequest gesetzt.

Für mehr sehen Sie die Dokumentation: NSFetchRequest Class Reference

+1

Vielen Dank für Ihr Feedback. Leider bietet es zu diesem Zeitpunkt mehr Probleme als Lösungen. Die Ergebnisse, soweit ich das beurteilen kann, müssen als NSDictionary zurückgegeben werden, so dass ich einige der Funktionen verloren habe, die als verwaltete Objekte zurückgegeben wurden. dh. Die Daten haben auch eine Beziehung zu einer anderen Entität namens "Category", die ich zuvor nicht erwähnt habe. Es definiert die Abschnitte jedes Ereignisses. – Jim