2012-10-05 109 views
6

安裝程序:我有一個父對象的集合,稱它們爲ObjectA。每個ObjectA與ObjectB都有一對多的關係。所以,一個ObjectA可以包含0..n ObjectB-s,每個ObjectB都有一個特定的ObjectA作爲它的父節點。如何根據相關對象集合的屬性對核心數據結果進行排序?

現在,我想要做一個ObjectA-s的核心數據提取,它們按照最新的ObjectB排序。有沒有可能爲此創建一個排序描述符?

a related question描述完全相同的情況。答案建議將ObjectB中的屬性非規範化爲ObjectA。如果真的沒有辦法通過一個獲取請求來做到這一點,那就沒問題了。

的相關問題也提到:

Actually, I just had an idea! Maybe I can sort Conversations by [email protected]

我試過了。這似乎不可能。我得到這個錯誤:

2012-10-05 17:51:42.813 xxx[6398:c07] *** Terminating app due to uncaught 
exception 'NSInvalidArgumentException', reason: 'Keypath containing 
KVC aggregate where there shouldn't be one; failed to handle 
[email protected]' 

是反規範化的屬性到對象A的唯一/最好的解決辦法?

回答

0

您可以添加在對象B的屬性,它是將日期的時間戳記,然後獲取請求,你可以做這樣的事情:

NSSortDescriptor *descriptor = [[NSSortDescriptor alloc] initWithKey:@"objectB.addTime" ascending:YES]; 
... 
fetchRequest.sortDescriptors = @[descriptor]; 
+2

這對我不起作用: 'NSInvalidArgumentException',原因:'對多關鍵不允許在這裏' –

0

我知道這個問題是有點老,但什麼我所做的是獲取所有ObjectB,迭代結果並取出ObjectB屬性並將其添加到新數組中。

NSFetchRequest *fetchRequest = [NSFetchRequest new]; 
[fetchRequest setEntity:self.entityDescForObjectB]; 

// sort 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"date" ascending:YES]; 
[fetchRequest setSortDescriptors:@[sortDescriptor]]; 

NSError *error = nil; 
NSArray *fetchedObjects = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
if (fetchedObjects == nil) { 
    NSLog(@"Error fetching objects: %@", error.localizedDescription); 
    return; 
} 

// pull out all the ObjectA objects 
NSMutableArray *tmp = [@[] mutableCopy]; 
for (ObjectB *obj in fetchedObjects) { 
    if ([tmp containsObject:obj.objectA]) { 
     continue; 
    } 
    [tmp addObject:obj.objectA]; 
} 

這是可行的,因爲CoreData是一個對象圖,所以你可以向後工作。最後的循環基本上檢查tmp數組是否已經有一個特定的ObjectA實例,如果沒有將它添加到數組中。

排序ObjectBs是非常重要的,否則這個練習是毫無意義的。

相關問題