2012-07-04 12 views
8

È possibile utilizzare la funzione personalizzata (strftime) in gruppo per parte quando si crea NSFetchRequest in ogg-c? Le istruzioni SQL è perfettamente valido SQLite:Dati principali: è possibile utilizzare la funzione personalizzata nel gruppo di

select date, count(*) from note group by strftime('%Y%m%d', date) 

Tuttavia, dopo una giornata di scavare e provare vari modi e le soluzioni sono arrivato alla conclusione che è impossibile farlo con i dati di base in un'unica sql recupero. Sto utilizzando NSFetchRequest con setPropertiesToGroupBy (solo iOS 5.0).

AGGIORNAMENTO. C'è un example per ottenere tale comportamento con i dati principali forniti da Apple. Tuttavia, ho abilitato "-com.apple.CoreData.SQLDebug 1" per mostrare SQL eseguito dai dati principali. Sembra che i dati di base non stiano eseguendo il mio SQL desiderato. Semplicemente li seleziona tutti con una prima query sql, quindi scorre tra i gruppi eseguendo più query "SELEC .. WHERE ID IN ...." SQL. Un estratto dalla console:

2012-07-05 10:34:57.244 DateSectionTitles[1139:fb03] CoreData: sql: SELECT 0, t0.Z_PK  FROM ZEVENT t0 ORDER BY t0.ZTIMESTAMP 
2012-07-05 10:34:57.245 DateSectionTitles[1139:fb03] CoreData: annotation: sql connection fetch time: 0.0010s 
2012-07-05 10:34:57.246 DateSectionTitles[1139:fb03] CoreData: annotation: total fetch execution time: 0.0015s for 52 rows. 
2012-07-05 10:34:57.247 DateSectionTitles[1139:fb03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZTIMESTAMP, t0.ZTITLE FROM ZEVENT t0 WHERE t0.Z_PK IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ORDER BY t0.ZTIMESTAMP LIMIT 20 
2012-07-05 10:34:57.248 DateSectionTitles[1139:fb03] CoreData: annotation: sql connection fetch time: 0.0012s 
2012-07-05 10:34:57.249 DateSectionTitles[1139:fb03] CoreData: annotation: total fetch execution time: 0.0022s for 20 rows. 
2012-07-05 10:34:57.250 DateSectionTitles[1139:fb03] CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZTIMESTAMP, t0.ZTITLE FROM ZEVENT t0 WHERE t0.Z_PK IN (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) ORDER BY t0.ZTIMESTAMP LIMIT 20 
2012-07-05 10:34:57.281 DateSectionTitles[1139:fb03] CoreData: annotation: sql connection fetch time: 0.0303s 
2012-07-05 10:34:57.281 DateSectionTitles[1139:fb03] CoreData: annotation: total fetch execution time: 0.0310s for 20 rows. 

risposta

4

Sì, è possibile. Assemblare il NSFetchedResultsController simile a:

NSFetchedResultsController *aFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
    managedObjectContext:someManagedObjectContext 
    sectionNameKeyPath:@"yearOnly" // <== 
    cacheName:@"cacheAsneeded"]; 

poi dentro la classe NSManagedObject aggiungere un metodo da utilizzare con sectionNameKeyPath

- (int)yearOnly { // 
    NSCalendar *cal = [NSCalendar currentCalendar]; 
    return [[cal components:NSYearCalendarUnit fromDate:self.date] year]; 
} 

La richiesta restituirà i risultati raggruppati per l'anno in modo che ogni anno incontrato diventerà una sezione.

Se è necessario un raggruppamento per mese, è possibile modificare i componenti del calendario in modo appropriato.

Per il conteggio (*) aggiungere un NSExpression al vostro fetchRequest:

NSExpression * many = [NSExpression expressionForFunction:@"count:" arguments:[NSArray arrayWithObject:[NSExpression expressionForKeyPath:@"someAttribute"]]]; 
+0

Grazie, proverò. Avere notato, NSFetchedResultsController viene spesso utilizzato con delega, è obbligatorio o facoltativo impostare NSFetchedResultsController delegato? Posso usarlo allo stesso modo di NSFetchRequest? – Centurion

+0

Il delegato è facoltativo. Vedere la documentazione: 'Un'istanza di NSFetchedResultsController utilizza metodi in questo protocollo per notificare al delegato che i risultati del recupero del controller sono stati modificati a causa di operazioni di aggiunta, rimozione, spostamento o aggiornamento. Per esempio in un UITableView lo si userebbe per aggiorna le righe e la sezione dopo che il set di dati è stato modificato – Olaf

Problemi correlati