Actualmente utilizando Datos principales. Tengo una tabla en la que estoy tratando de recuperar la información a lo largo de estas líneas:Recuento distintivo a través de datos centrales, NSExpression en NSFetchedResultsController
SELECT item, COUNT(*) FROM myTable GROUP BY item;
con el fin de producir este tipo de resultado:
+---------+------+-------+
| item | COUNT(*) |
+---------+------+-------+
| group 1 | 2 |
| group 2 | 5 |
| group 3 | 8 |
+---------+------+-------+
tuve la brillante idea de utilizar un NSExpression , con la esperanza de tener Core Data hacer todo el trabajo por mí. Estoy empezando a hacer girar mis ruedas. La función de expresión : me falla. La excepción no es muy clara. El uso de otras funciones de expresión, como suma: no bloquea la aplicación.
Sería bueno almacenar los resultados en un NSFetchedResultsController. Exploré otras opciones, ninguna de las cuales es demasiado atractiva. ¿Tendría más sentido escribir una consulta SQL y terminarla, en lugar de usar Core Data como contenedor de SQL en este caso?
El código fuente de referencia está debajo.
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"item"];
NSExpression *totalExpression = [NSExpression expressionForFunction:@"count:" arguments:[NSArray arrayWithObject:keyPathExpression]];
NSExpressionDescription * totalExpressionDescription = [[NSExpressionDescription alloc] init];
[totalExpressionDescription setExpression:totalExpression];
[totalExpressionDescription setExpressionResultType:NSInteger64AttributeType];
[totalExpressionDescription setName:@"totalInstances"];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"myEntity" inManagedObjectContext:self.managedObjectContext];
NSArray *propertiesToFetch = [[NSArray alloc] initWithObjects:strFieldName, totalExpressionDescription, nil];
[fetchRequest setEntity:entity];
[fetchRequest setReturnsDistinctResults:YES];
[fetchRequest setResultType:NSDictionaryResultType];
[fetchRequest setPropertiesToFetch:propertiesToFetch];
[fetchRequest setFetchBatchSize:20];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:strFieldName ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
NSFetchedResultsController* aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self managedObjectContext] sectionNameKeyPath:nil cacheName:nil];
...
NSError *error = nil;
if (![self.fetchedResultsController performFetch:&error])
{
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
Veo que me faltaba NSPropertyDescription, lo que habría permitido que NSFetchRequest se haya interpretado correctamente como una consulta SQL agregando la línea "Agrupar por elemento". No estaba al tanto de ese objeto en el momento de la publicación. Podría haber usado tu respuesta en febrero ... jaja. Esto es bueno saberlo, en caso de que decida usar esta solución en el futuro. Tu respuesta es apreciada :-) –
Una nota, el autor original mencionó usar NSFetchedResultsController con la agrupación. Desafortunadamente para que funcione 'setPropertiesToGroupBy' usted necesita' setResultType: NSDictionaryResultType' que deshabilita los cambios de seguimiento. Ver http://stackoverflow.com/a/4361198/287403 –
¿Es posible clasificarlos por conteo? – Andy