2012-07-04 35 views
8

Có thể sử dụng chức năng tùy chỉnh (strftime) trong nhóm từng phần khi tạo NSFetchRequest trong mục tiêu-c không? Các báo cáo sql là hoàn toàn hợp lệ trong sqlite:Dữ liệu cốt lõi: Có thể sử dụng chức năng tùy chỉnh trong nhóm theo

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

Tuy nhiên, sau một ngày đào và cố gắng cách và các giải pháp khác nhau tôi đi đến kết luận nó không thể làm điều đó với dữ liệu cốt lõi trong sql đơn lấy. Tôi đang sử dụng NSFetchRequest với setPropertiesToGroupBy (chỉ dành cho iOS 5.0).

CẬP NHẬT. Có một số example để nhận được hành vi như vậy với dữ liệu cốt lõi do apple cung cấp. Tuy nhiên, tôi đã bật "-com.apple.CoreData.SQLDebug 1" để hiển thị SQL được thực hiện bởi dữ liệu lõi. Nó xuất hiện, dữ liệu cốt lõi không thực hiện SQL mong muốn của tôi. Nó chỉ chọn tất cả chúng với một truy vấn sql đầu tiên, và sau đó lặp lại thông qua các nhóm thực hiện nhiều truy vấn "SELEC .. WHERE ID IN ....". Đoạn trích từ bảng điều khiển:

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. 

Trả lời

4

Có thể. Lắp ráp của bạn NSFetchedResultsController tương tự như:

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

Sau đó, bên trong lớp NSManagedObject bạn thêm một phương pháp được sử dụng với sectionNameKeyPath

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

Các yêu cầu sẽ trả lại kết quả phân nhóm theo năm để mỗi năm gặp sẽ trở thành một phần.

Nếu bạn cần nhóm theo tháng, bạn có thể muốn thay đổi các thành phần lịch một cách thích hợp.

Đối với count (*) thêm một NSExpression để fetchRequest của bạn:

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

Cảm ơn, sẽ cố gắng. Đã nhận thấy, NSFetchedResultsController thường được sử dụng với ủy nhiệm, là bắt buộc hay tùy chọn để thiết lập ủy nhiệm NSFetchedResultsController? Tôi có thể sử dụng nó theo cách tương tự như NSFetchRequest không? – Centurion

+0

Đại biểu là tùy chọn. Xem tài liệu: 'Một thể hiện của NSFetchedResultsController sử dụng các phương thức trong giao thức này để thông báo cho đại biểu của mình rằng kết quả tìm nạp của bộ điều khiển đã bị thay đổi do thêm, xóa, di chuyển hoặc cập nhật hoạt động.' Ví dụ trong UITableView bạn sẽ sử dụng nó cập nhật các hàng và phần sau khi tập dữ liệu đã được sửa đổi – Olaf

Các vấn đề liên quan