1

我需要我的對象進行排序段排序使用NSFetchedResultsController部分由

[[NSFetchedResultsController alloc] initWithFetchRequest:request 
            managedObjectContext:context 
             sectionNameKeyPath:sectionName 
               cacheName:nil]; 

我想通過自己的class對它們進行排序。例如,MyObjectType類型的對象進入一個部分,而OtherObjectType類型的對象進入第二部分,其中兩個對象類型將出現在結果中,因爲OtherObjectType繼承自MyObjectType。通過@"class"作爲sectionNameKeyPath參數在上述方法似乎工作。但是,要獲得正確的排序我還需要NSFetchRequest的排序描述符進行排序基於類:

NSSortDescriptor *sectionDescriptor = [NSSortDescriptor 
             sortDescriptorWithKey:@"class" 
             ascending:YES]; 

使用這種描述給我的錯誤Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath class not found in entity

爲了清楚起見,這裏是代碼的完整塊,我想工作:

NSFetchRequest* myRequest = [[NSFetchRequest alloc] 
           initWithEntityName:@"myEntityName"]; 

    NSSortDescriptor *nameDescriptor = [NSSortDescriptor 
             sortDescriptorWithKey:@"myName" 
             ascending:YES]; 

    NSSortDescriptor *sectionDescriptor = [NSSortDescriptor 
              sortDescriptorWithKey:@"class" 
              ascending:YES]; 
    request.sortDescriptors = @[sectionDescriptor, nameDescriptor]; 

    [[NSFetchedResultsController alloc] 
    initWithFetchRequest:myRequest 
    managedObjectContext:myContext 
    sectionNameKeyPath:@"class" 
    cacheName:nil]; 

回答

1

請記住,如果您使用的是一個實體及其子實體,則只能執行此操作,因爲NSFetchRequest需要實體進行搜索(您可以指定也搜索子實體)。

您需要聲明一個屬性來標識要檢索和重新組合的正確類型的記錄。因爲class是一個運行時值,所以您需要能夠使用標識符在底層存儲中使用。因此,在您的具體情況下,我會在所有子實體的父實體上使用常量(字符串或數字)屬性來標識此記錄屬於哪個子組。

+0

沒錯。我忘了提及我正在處理的類是我用結果控制器提取的類中的所有子實體。所以,他們都在那裏。我只是需要按課程來排序。目前,我在父實體上使用字符串屬性來標識節。我希望我能擺脫那個財產。 –

+1

該屬性可以幫助您,因爲它允許您在持久性存儲級別執行此操作,而不必在內存中執行操作(除非您正在使用內存存儲)。如果使用SQLite,這比在內存中執行它更快,並且要查找每個實體/子實體的類成員的運行時值。總之,你已經做得很好。 – J2theC

+0

我甚至沒有想到執行運行時變量檢查的成本。總之,我認爲這是做到這一點的最佳方式。我會繼續與我目前使用的屬性將它們分成幾個部分。 –

1

你不能用一個單一的FRC這樣做,因爲NSFetchRequest只能依賴於一個單一的NSManagedObject子類。相反,您可以使用多個提取的結果控制器,並在查找對象時手動設置節索引。

+0

不是必需的。它們綁定到一個實體,可以包含子實體。 – J2theC

+0

我想這是一個公平點,你可以遍歷對象圖,但這是間接的。有什麼思想活動試圖用sectionNameKeyPath來完成是不可能的,儘管...相信我我已經嘗試過足夠多的時間了。假設他沒有像你所建議的那樣有一個孩子的關係結構,他或者需要使用單獨的FRC,或者他需要自己處理獲取請求。 – smyrgl

+0

我在說的是,只要使用同一個子實體樹,只需使用一個FRC即可完成此操作。你不能做的是使用不同的實體,這些實體在繼承中不相互關聯。 – J2theC

相關問題