0

我想按'recordDate'將數據分成不同的部分,然後對於每個部分數據將按'elementName'按升序排序。以下是當前代碼(不工作):當第一個描述符是NSDate時,多個NSSortDescriptor不工作

NSManagedObjectContext *context = self.tankDatabase.managedObjectContext; 
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Log"]; 
request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"recordDate" ascending:NO], [NSSortDescriptor sortDescriptorWithKey:@"elementName" ascending:YES selector:@selector(localizedStandardCompare:)], nil]; 
request.predicate = [NSPredicate predicateWithFormat:@"ownedBy = %@", self.tank]; 


self.controller = [[NSFetchedResultsController alloc] 
              initWithFetchRequest:request 
              managedObjectContext:context 
              sectionNameKeyPath:@"recordDate" 
              cacheName:nil]; 

self.controller.delegate = self; 

NSError *error; 
BOOL success = [self.controller performFetch:&error]; 

然而,當我嘗試使用其他屬性進行排序(例如:ASC的ElementName,價值DESC並將它們按的ElementName)它的工作,因爲它應該。請注意,recordDate是數據模型中的'Date'類型和類中的NSDate。

另外recordDate包含分鐘&秒,它需要分組到這個細節。

我試圖搜索整個互聯網類似的情況下,但我還沒有找到任何解決方案的工作。我在代碼中錯過了什麼?還是僅僅是一個蘋果的錯誤?感謝您的時間和協助。

+0

如果從第二個排序描述符中刪除選擇器會發生什麼? CoreData對數據庫中的東西進行排序,因此您不能使用自定義選擇器或比較器進行排序描述符。 – 2012-08-15 09:59:52

+0

如果我刪除選擇器,沒有什麼改變。 – 2012-08-15 15:11:59

回答

1

我終於想通了:

顯然它也被保存到核心數據使不工作的日期之間的比較(即使日期進行比較的份額完全相同的日期)的亞秒級的信息。

所以我所做的就是將其保存到核心數據之前移除亞秒級信息:

self.recordDate = [NSDate dateWithTimeIntervalSinceReferenceDate:floor([recordDate timeIntervalSinceReferenceDate])]; 

我希望這可以幫助任何人都面臨着同樣的問題。乾杯!

0

是的,如果你想要你的subsorting描述符(基於elementName)踢,那麼你需要一些關於recordDate的關係,所以你截斷recordDate的想法是好的。事實上,很多時候,NSDate信息被截斷爲YY:MM:DD,因此屬於同一天的所有事件都是不可區分的。另外,通常只有您的sectionNameKeyPath需要「粗粒度」,例如,您通過從recordDate中除去亞秒信息來創建新的瞬態屬性,並將THAT作爲sectionNameKeyPath饋送給NSFetchedResultsController。換句話說,你可以繼續使用recordDate,因爲它是...

這將類似於姓氏排序(升序說),其中節名稱是A,B,C,...,Z.