2012-04-10 7 views
6

두 개 이상의 항목이있는 하위 범주가있는 범주는 모두 어떻게 찾을 수 있습니까? 다음 코드를 사용하고 있지만 여기에 "여러 개의 여러 키가 허용되지 않습니다"가 표시됩니다.NSPredicate to many 관계

SUBQUERY를 사용해야합니까?

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Categories"]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.items > 0"]; 
[request setPredicate:predicate]; 

도움말! :)

+0

NSCompoundPredicate를 통해 여러 NSPredicate를 사용하십시오. https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pCreating.html –

+0

'items'은 아마도'@ count'를 사용하여 설정되었습니다. –

답변

3

NSPredicate에서 [email protected] >0을 대신 사용해야합니다.

Sorr은 카테고리 하위 카테고리가 1 대 1 인 경우에만 작동합니다.

정말로,해야 할 일은 항목이없는 모든 하위 카테고리를 삭제하는 것입니다.

tou는 하위 카테고리가 있는지 여부를 확인해야하며 이는 비어 있지 않음을 의미합니다. [email protected] >0

+0

당신의 도움에 감사드립니다.'NSInvalidArgumentException'을 받고, 이유 : '지원되지 않는 함수 표현식 개수 : (subcategories.items)'. 카테고리는 하위 카테고리와 대다수의 관계를 가지며, 하위 카테고리는 하위 카테고리와 일대 다 관계를가집니다. – Nimrod7

2

SQL 백엔드에서만 일대 다 관계를 사용할 수 있습니다. 이 작업을 수행하지만 순서가 지정된 집합에 "백 링크"를 추가해야합니다 (정렬을 사용하는 경우 순서를 유지하려면 고유 범주를 여러 범주로 나눌 수 있으므로 고유성을 유지해야합니다). 한계를 고려하면 이상적은 아니지만 나쁘지 않습니다.

// Search for all subcategories with item count > 0 
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Subcategory"]; 
request.predicate = [NSPredicate predicateWithFormat:@"[email protected] > 0"]; 
NSError *error = nil; 
// They should have an inverse relationship to their category... 
// We have to iterate and insert them in to a set, but there is no additional 
// disk access. 
NSMutableOrderedSet *results = [NSMutableOrderedSet orderedSet]; 
[[self.projectDatabase.managedObjectContext executeFetchRequest:request error:&error] enumerateObjectsUsingBlock:^(Subcategory *obj, NSUInteger idx, BOOL *stop) { 
    [results addObject:obj.category]; 
}]; 

편집

불행하게도, 나는 이것이 SQL 저장소로 가능하다고 생각하지 않습니다. 먼저, SQL 전문가와 가까운 곳이 아니라는 것을 강조하고 일반적으로 이러한 유형의 쿼리가 필요하지 않도록 CoreData 저장소를 설계하려고합니다. 그러나 다음 SUBQUERY는 InMemory 저장소에서 작동하므로 적절하게 형식이 지정된 하위 쿼리입니다.

fetchRequest.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(subcategories, $s, [email protected] > 0)[email protected] > 0"]; 

그러나 SQL 술어를 사용할 때이 술어는 오류를 제공합니다. 문서는 SQL 상점에서 술어를 사용할 때 상당한 수의 제한이 있다고 말합니다. 그래서 나는 놀랍지도 않고, 이것을 연구하는데 너무 많은 시간을 소비하지도 않습니다.

KVC 집합체를 포함하는 키 패스. $ s.items를 처리 할 수 ​​ 에 실패했습니다. @ 내 경험을 바탕으로

+0

방금 ​​다른 접근 방식을 시도했습니다. 이 일이 당신을 위해합니까? –

+0

옙, 내가 사용하고있는 thats,하지만 데이터베이스 수준에서 하위 쿼리 또는 @ count (방법이있을 경우)를 통해 그것을 찾고 있었다. 반복이 가장 효율적인 방법인지 확신 할 수 없습니다. 하위 범주 및 항목이 집합이므로 – Nimrod7

9

, 당신은

@"[email protected] > 0" 

@"ANY subcategories.items > 0" 

에서

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY subcategories.items > 0"];  

에서 술어 형식 문자열을 변경해야합니다 계산

모든 키 rd도 같이 가야합니다. 그렇지 않으면 속성을 잘못된 방식으로 쿼리하게됩니다.

+0

은 NSInvalidArgumentException을 발생시킵니다. – Nimrod7