NSPnetworkingicate: busca uno de cada tipo

Quiero crear una NSFetchRequest para objects como este:

El Object es Car que tiene un color attribute . Tengo cuatro autos:

 car1.color = networking car2.color = networking car3.color = blue car4.color = green 

Quiero crear un NSPnetworkingicate que select solo un automobile para cada color (no importa qué automobile select.

¿Cómo puedo conseguir esto?

De hecho, estoy buscando algo similar como un DISTINCT en SQL

Core Data admite search valores distintos. Apple incluso proporciona código de muestra aquí: http://developer.apple.com/library/ios/#documentation/DataManagement/Conceptual/CoreDataSnippets/Articles/fetchExpressions.html


Desde esa página:

Obteniendo Valores Distintos

Para search los valores únicos de un atributo particular en todas las instancias de una entidad determinada, configura una petición de búsqueda con el método setReturnsDistinctResults: (y pase SÍ como parámetro). También especifica que la búsqueda debe devolver los dictionarys en lugar de los objects administrados, y el nombre de la propiedad que desea search.

Swift 2.0

 let context:NSManagedObjectContext! = <#Get the context#> let entity = NSEntityDescription.entityForName( "<#Entity name#>", inManagedObjectContext:context ) let request = NSFetchRequest() request.entity = entity request.resultType = .DictionaryResultType request.returnsDistinctResults = true request.propertiesToFetch = [ "<#Attribute name#>" ] var objects:[[String:AnyObject]]? do { try objects = context.executeFetchRequest( request ) } catch { // handle failed fetch } 

Obj-C

 NSManagedObjectContext *context = <#Get the context#>; NSEntityDescription *entity = [NSEntityDescription entityForName:@"<#Entity name#>" inManagedObjectContext:context]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entity]; [request setResultType:NSDictionaryResultType]; [request setReturnsDistinctResults:YES]; [request setPropertiesToFetch:@[@"<#Attribute name#>"]]; // Execute the fetch. NSError *error = nil; id requestedValue = nil; NSArray *objects = [context executeFetchRequest:request error:&error]; if (objects == nil) { // Handle the error. } 

(Una "gotcha" es que los resultados se devolverán como dictionarys; si necesita los objects, puede hacer otra búsqueda para getlos por identificación)

¿ valueForKeyPath usar valueForKeyPath ? Puede hacer algo así en la matriz que NSPnetworkingicate le proporciona.

 NSArray* distinctColors = [cars valueForKeyPath:@"@distinctUnionOfObjects.color"]; 

Te devolverá los colors distintivos que tienes, no sé si es lo que quieres, pero con los colors puedes hacer algo como @Anupdas dijo:

Si está orientado a iOS 4.0 o posterior y no usa la tienda Core-Data SQL, ¿por qué no usar pnetworkingicateWithBlock: ?

Lo siguiente generará la NSFetchRequest que desee.

 - (NSFetchRequest*) fetchRequestForSingleInstanceOfEntity:(NSString*)entityName groupedBy:(NSString*)attributeName { __block NSMutableSet *uniqueAttributes = [NSMutableSet set]; NSPnetworkingicate *filter = [NSPnetworkingicate pnetworkingicateWithBlock:^(id evaluatedObject, NSDictionary *bindings) { if( [uniqueAttributes containsObject:[evaluatedObject valueForKey:attributeName]] ) return NO; [uniqueAttributes addObject:[evaluatedObject valueForKey:attributeName]]; return YES; }]; NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:entityName]; req.pnetworkingicate = filter; return req; } 

A continuación, puede crear un nuevo método para ejecutar la búsqueda y devolver los resultados que desee.

 - (NSArray*) fetchOneInstanceOfEntity:(NSString*)entityName groupedBy:(NSString*)attributeName { NSFetchRequest *req = [self fetchRequestForSingleInstanceOfEntity:entityName groupedBy:attributeName]; // perform fetch NSError *fetchError = nil; NSArray *fetchResults = [_context executeFetchRequest:req error:&fetchError]; // fetch results if( !fetchResults ) { // Handle error ... return nil; } return fetchResults; } 

¿Estás buscando algo así?

 NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Car"]; [fetchRequest setPnetworkingicate:[NSPnetworkingicate pnetworkingicateWithFormat:@"color == %@",@"green"]]; [fetchRequest setFetchLimit:1]; NSError *error = nil; NSArray *fetchedCars = [context executeFetchRequest:fetchRequest error:&error]; Car *car = [fetchedCars lastObject]; if(!car){ //Handle the error } 

testing esto:

 NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Selected_data" inManagedObjectContext:self.managedObjectContext]; [request setEntity:entity]; NSPnetworkingicate *pnetworkingicatecnName = [NSPnetworkingicate pnetworkingicateWithFormat:@"countries contains[cd] %@", Countryid]; NSPnetworkingicate *pnetworkingicateLn = [NSPnetworkingicate pnetworkingicateWithFormat:@"languages contains[cd] %@", languageid]; NSArray *subPnetworkingicates = [NSArray arrayWithObjects:pnetworkingicatecnName, pnetworkingicateLn, nil]; NSPnetworkingicate *pnetworkingicate = [NSCompoundPnetworkingicate andPnetworkingicateWithSubpnetworkingicates:subPnetworkingicates]; [request setPnetworkingicate:pnetworkingicate]; NSMutableArray *sendfd=[[NSMutableArray alloc] init]; NSError *error; NSArray *array1 = [self.managedObjectContext executeFetchRequest:request error:&error]; if (array1 != nil) { for (Selected_data *sld in array1) { [sendfd addObject:sld.providers]; } } else { } return sendfd; 

testing este:

  NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Cars"]; NSArray *arrayValues = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; if (arrayValues.count != 0) { NSDictionary *result = [NSDictionary dictionaryWithObjects:arrayValues forKeys:[arrayValues valueForKey:@"color"]]; return [result allValues]; }