2012-07-04 17 views
8

Czy można użyć funkcji niestandardowej (strftime) w grupie według części podczas tworzenia NSFetchRequest w funkcji -c? W SQL jest całkowicie poprawny w SQLite:Dane podstawowe: Czy można użyć funkcji niestandardowej w grupie przez

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

Jednak po dzień kopania i próbuje różnych sposobów i rozwiązań, doszedłem do wniosku, że to niemożliwe, aby to zrobić z danymi podstawowymi w pojedynczym SQL pobierania. Używam NSFetchRequest z setPropertiesToGroupBy (tylko iOS 5.0).

AKTUALIZACJA. Istnieje example za uzyskanie takiego zachowania z danymi podstawowymi dostarczonymi przez Apple. Jednak włączono opcję "-com.apple.CoreData.SQLDebug 1" w celu wyświetlenia kodu SQL wykonanego na podstawie danych podstawowych. Wygląda na to, że dane podstawowe nie wykonują pożądanego kodu SQL. Po prostu wybiera je wszystkie za pomocą pierwszego zapytania sql, a następnie wykonuje pętle w grupach wykonujących wiele zapytań SQL "SELEC .. WHERE IN ...". Fragment konsoli:

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. 

Odpowiedz

4

Tak, możesz. Zestawianie NSFetchedResultsController podobny do:

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

następnie wewnątrz klasy NSManagedObject dodać metodę należy stosować sectionNameKeyPath

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

Żądanie powróci wyniki pogrupowane według roku, tak aby każdy napotkał lat staną się Sekcja.

Jeśli potrzebujesz grupowania według miesięcy, możesz odpowiednio zmienić komponenty kalendarza.

Dla count (*) dodać NSExpression do fetchRequest:

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

Dzięki, spróbuje. Zauważyłem, NSFetchedResultsController często jest używany z delegacją, jest to obowiązkowe lub opcjonalne, aby ustawić delegata NSFetchedResultsController? Czy mogę używać go w taki sam sposób jak NSFetchRequest? – Centurion

+0

Delegat jest opcjonalny. Zobacz dokumentację: 'Instancja NSFetchedResultsController używa metod w tym protokole do powiadomienia swojego delegata, że ​​wyniki pobierania kontrolera zostały zmienione z powodu dodawania, usuwania, przenoszenia lub aktualizacji operacji. Na przykład w UITableView używałbyś go do zaktualizuj wiersze i sekcję po zmodyfikowaniu zestawu danych – Olaf

Powiązane problemy