2013-06-26 56 views
1

我有類似下面的模式:如何根據核心數據中的子關係計數進行排序?

enter image description here

我想查詢已經喜歡上了一定PAGEID帖子的所有用戶。我只想在User.liked中返回與給定pageId匹配的帖子。此外,我希望它按User.liked的數量排序。

我可以一次完成這一切嗎?

到目前爲止我的代碼:

NSFetchRequest* userFetch = [NSFetchRequest fetchRequestWithEntityName:@"User"]; 

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"(SUBQUERY(liked, $x, $x.page.pageId = %@)[email protected] > 0)", self.pageId]; 
[userFetch setPredicate:predicate]; 

NSArray *allUsers = [_document.managedObjectContext executeFetchRequest:userFetch error:nil]; 

能正確只給我說,至少有一個喜歡的網頁,但可能包括來自User.liked其他頁面帖子的用戶對象。此外,它沒有排序。

我可以按這樣做後取:

_users = [allUsers mutableCopy]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"[email protected]" ascending:NO]; 
_users = [[_users sortedArrayUsingDescriptors:@[sortDescriptor]] mutableCopy]; 

但是,這一切SLOOOOOOOWS下來。如果在抓取中沒有辦法進行排序,我怎樣才能加快排序後取回的速度?

我是一個CoreData newb,當我像這樣陷入困境時,我通常最終只會拋棄CoreData,並開始通過將我的NSObjects序列化到磁盤來管理數據。任何提示之前,我在這裏做?

謝謝!

回答

0

至於我記得,子查詢中你應該使用「==」而不是「=」所以,你可以使用子查詢嘗試:

@"(SUBQUERY(liked, $x, $x.page.pageId == %@)[email protected] > 0)" 

這可能會解決部分but might include Posts from other Pages in User.liked

編輯

+0

不幸的是,你不能使用@語法排序與多對多關係。 :( – pj4533

+1

此外,據我所知SUBQUERY只是評估真/假,不是嗎?所以基本上,它會返回用戶對象,或不,它不會過濾它。 '無論如何都會擴展爲'=='。 – pj4533

+0

嘗試看到這個主題http://stackoverflow.com/questions/6890079/subquery-in-core-data特別檢查出的評論唯一的答案。對我來說,似乎除了需要進行排序 – makaron