2009-11-23 9 views
5

Tengo una base de datos de eventos cargada en Core Data que tiene títulos duplicados de eventos. Esto se ha hecho para que la base de datos pueda proporcionar información única para cada día del evento. Ej. Fluctuaciones en los precios en cada fecha.Ordenando datos principales con predicado para eliminar duplicados

Ahora necesito eliminar los títulos duplicados de eventos de una lista que se mostrará como vista de tabla con NSFetchRequest y NSPredicate para proporcionar el filtro. Pero todos los ejemplos que he visto requieren un valor clave no dinámico para ser utilizado como un objetivo para el filtro de predicados. por ejemplo, debajo de NSDate proporciona el tiempo ahora como filtro de clave y funciona.

Actualmente, el título de NSString * se dirige a un valor en la clase ManagedObject de eventos que devuelve un valor nulo. Aquí hay un recorte de 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

mismo problema aquí. –

Respuesta

4

También podemos establecer

setReturnsDistinctResults:YES 

en su fetchRequest.

Para más información, ver los documentos: NSFetchRequest Class Reference

+1

Gracias por su comentario. Lamentablemente, ha proporcionado más problemas que soluciones en esta etapa. Los resultados, hasta donde yo sé, deben devolverse como NSDictionary, de modo que pierdo parte de la funcionalidad devuelta como objetos administrados. es decir. Los datos también tienen una relación con otra entidad llamada 'Categoría' que no mencioné antes, las aplicaciones. Define las secciones de cada evento. – Jim

Cuestiones relacionadas