2013-10-25 162 views
1

按日期排序屬性我有以下模式:核心數據:在對多關係

Entities: Entity <----------->> SubEntity 
++++++++++++++++++++++++++++++++++++++++++++++++ 
Attributes: >name     >uuid 
      >identifier   >date 

問題#1: 我有Entities一提取請求。我想按每個Entity中所有SubEntities的最新date排序取回。我會怎麼做?

問題2: 此外,讀取請求有resultType = NSDictionaryResultType並在返回的字典,我想獲取的屬性namelatestDate(所有SubEntitiesEntity最新date)。那可能嗎?

回答

2

我的建議對你會改變你的模型:

一個latestDate屬性添加到Entity 當更新SubEntityentity屬性,請檢查SubEntitydate是否爲此最新的Entity對象並進行相應更新。

這將允許您通過簡單的查詢完成所需的任務,然後您將能夠使用提取的結果控制器來跟蹤數據更改。

如果你不能重構你的模型,看看@Michal K的答案,但預取所有你的EntitySubEntity對象(2個請求),然後使用他的算法。

2

問題#1

我不認爲你可以做到這一點的集合關係使用NSSortDescriptor。你可以對它進行子查詢,但它們只是過濾對象;他們不排序。

我會建議您採取下列措施:

首先挑SubEntity與最新的日期(最大)每個Entity

NSArray *entities = ... // fetch here all your entities 

NSMutableArray *result = [NSMutableArray array]; 
for (Entity *entity in entities) { 
    SubEntity *max = [[entity subEntities] valueForKeyPath:@"@max.date"]; 
    if (max) [result addObject:max]; 
} 

後來乾脆下令result陣列:

id sort = [NSSortDescriptor sortDescriptorWithKey:@"date" ascending:NO]; 
result = [[result sortedArrayUsingDescriptors:@[sort]] mutableCopy]; 

和您最終將收集按日期排序的SubEntity對象。 您可以直接從SubEntity訪問Entity

問題#2

據我知道你不能做到這一點的方式。您可以使用上述解決方案訪問這些元素。

+1

這將在整個數據集中發生錯誤(如果您有N個實體和M個實體,您將有1次大的行程到達商店以獲取所有N個實體,然後M前往商店獲取每個子實體實體==> O(M)到商店的行程)==>性能很差 –

+0

發生故障時,如果數據在其高速緩存中可用或預取,Core Data不會直接進入存儲區。由於問題沒有具體說明數據的大小,也沒有要求獲得最佳性能,所以我更願意將這些細節放在我的答案之外。 –