iphone ios objective-c nspredicate nsfetchedresultscontroller

iphone - NSPredicate: trae uno de cada tipo



ios objective-c (5)

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

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

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

Quiero crear un NSFetchRequest para objetos como este:

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

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

Quiero crear un NSPredicate que seleccione solo un automóvil para cada color (no importa qué automóvil seleccione).

¿Cómo puedo conseguir esto?

De hecho estoy buscando algo parecido a DISTINCT en SQL


Core Data admite la obtención de valores distintos. Apple incluso proporciona código de muestra aquí: developer.apple.com/library/ios/#documentation/DataManagement/…

Desde esa página:

Obtención de valores distintos

Para obtener los valores únicos de un atributo particular en todas las instancias de una entidad dada, configure una solicitud de recuperación con el método setReturnsDistinctResults: (y pase SÍ como parámetro). También especifica que la búsqueda debe devolver diccionarios en lugar de objetos administrados, y el nombre de la propiedad que desea obtener.

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. }

(Un "gotcha" es que los resultados se devolverán como diccionarios; si necesita los objetos, puede hacer otra búsqueda para obtenerlos por ID)


Si está apuntando a iOS 4.0 o posterior y no está utilizando el almacén SQL de Core-Data, ¿por qué no usar predicateWithBlock: :?

Lo siguiente generará el NSFetchRequest que desee.

- (NSFetchRequest*) fetchRequestForSingleInstanceOfEntity:(NSString*)entityName groupedBy:(NSString*)attributeName { __block NSMutableSet *uniqueAttributes = [NSMutableSet set]; NSPredicate *filter = [NSPredicate predicateWithBlock:^(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.predicate = filter; return req; }

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

- (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; }


prueba 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]; }


prueba esto:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Selected_data" inManagedObjectContext:self.managedObjectContext]; [request setEntity:entity]; NSPredicate *predicatecnName = [NSPredicate predicateWithFormat:@"countries contains[cd] %@", Countryid]; NSPredicate *predicateLn = [NSPredicate predicateWithFormat:@"languages contains[cd] %@", languageid]; NSArray *subPredicates = [NSArray arrayWithObjects:predicatecnName, predicateLn, nil]; NSPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates]; [request setPredicate:predicate]; 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;