usar tutorial porque persistencia efecto datos data apple ios sql uitableview core-data

ios - porque - swift 4 core data tutorial



Cómo agrupar por día en NSDate con NSPredicate: necesario para crear múltiples secciones de UITableView (2)

Suponiendo que la idea es agrupar la matriz de objetos en una matriz de conjuntos de objetos, el enfoque que tomaría es el siguiente: empiece por encontrar los valores posibles para la fecha (o lo que sea que desee agrupar) y luego resáltelo.

NSArray *values = ...; NSArray *sorting = [values valueForKey:@"@distinctUnionOfObject.propertyToGroupBy"]; NSUInteger sectionCount = [sorting count]; NSMutableArray *sections = [NSMutableArray arrayWithCapacity:sectionCount]; for (int i = 0; i < sectionCount; i++) [sections addObject:[NSMutableArray array]]; [values enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { // Figure out the section for this object NSUInteger section = [sorting indexOfObject:obj.propertyToGroupBy]; [[sections objectAtIndex:section] addObject:obj]; }]; // sections will contain as many sections as there were unique values // each of those values is an array containing values that matched the criteria

Esto puede ser optimizado, pero desde lo alto de mi cabeza, parece ajustarse a la ley.

EDITAR: después de volver a la pregunta, el propertyToGroupBy tendría que normalizar el valor, es decir, eliminar los componentes de tiempo de la fecha, ya que la agrupación se realiza mediante valores únicos (es decir, la comparación se basa en isEqual :)

Ver también

Datos principales ordenados por fecha con FetchedResultsController en secciones

¿Hay alguna forma de agrupar objetos de una entidad CoreData por fecha y usarlos para crear varias secciones en un control UITableView?

Básicamente, necesito algo equivalente al siguiente pseudo-SQL, donde my_group_criteria () agrupa todas las pruebas por día:

SELECT * FROM tests GROUP BY my_group_criteria(date)

Como ejemplo, la consulta agruparía las siguientes filas en 3 secciones separadas:

[test1 | 2013-03-18 15.30.22] [test2 | 2013-03-18 14.30.22] [test3 | 2013-03-18 13.30.22] [test4 | 2013-03-17 18.30.22] [test5 | 2013-03-17 19.30.22] [test6 | 2013-03-15 20.30.22]

Como ya se respondió en 2 , NSPredicate no es para agrupar entidades, por lo que puede que este no sea el camino a seguir.

Dado esto, ¿cómo hago para crear secciones múltiples en una UITableView basado en algunos criterios similares a lo que haría SQL GROUP BY?

Me gustaría evitar acceder directamente a la base de datos SQL-lite si es posible.

Pregunta relacionada 1: NSPredicate: filtrado de objetos por día de propiedad NSDate

Pregunta relacionada 2: NSPredicar algo equivalente al GRUPO BY de SQL


Puede modificar el proyecto de muestra DateSectionTitles de la biblioteca de desarrolladores de Apple de acuerdo con sus necesidades.

En primer lugar, debe modificar la función de acceso para la propiedad transitoria sectionIdentifier para crear un identificador de sección en función del año + mes + día (en lugar de año + mes solamente):

- (NSString *)sectionIdentifier { // Create and cache the section identifier on demand. [self willAccessValueForKey:@"sectionIdentifier"]; NSString *tmp = [self primitiveSectionIdentifier]; [self didAccessValueForKey:@"sectionIdentifier"]; if (!tmp) { /* Sections are organized by month and year. Create the section identifier as a string representing the number (year * 10000 + month * 100 + day); this way they will be correctly ordered chronologically regardless of the actual name of the month. */ NSCalendar *calendar = [NSCalendar currentCalendar]; NSDateComponents *components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[self timeStamp]]; tmp = [NSString stringWithFormat:@"%d", [components year] * 10000 + [components month] * 100 + [components day]]; [self setPrimitiveSectionIdentifier:tmp]; } return tmp; }

En segundo lugar, se debe cambiar el método de delegado titleForHeaderInSection , pero la idea es la misma: extraer año, mes y día del identificador de sección y crear una cadena de título de encabezado a partir de eso:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { id <NSFetchedResultsSectionInfo> theSection = [[fetchedResultsController sections] objectAtIndex:section]; NSInteger numericSection = [[theSection name] integerValue]; NSInteger year = numericSection / 10000; NSInteger month = (numericSection / 100) % 100; NSInteger day = numericSection % 100; // Create header title YYYY-MM-DD (as an example): NSString *titleString = [NSString stringWithFormat:@"%d-%d-%d", year, month, day]; return titleString; }