2011-07-27 3 views
9

단순화하려면 다음을 수행하십시오. cards라는 테이블에 3 개의 열이 있습니다. 0의 정수 ..... 100NSPredicate SQL의 GROUP BY에 해당하는 항목

packTitle - -

아이디 packTitle 기간

ID가 열입니다 문자열 설명 팩, 팩 팩 1, 팩 2 3 종류 PACK3

가 말할 수

용어 - 서로 다른 정렬되지 않은 101 개의 항목 이름입니다. SQL 문에 의해

select packTitle from cards group by packTitle; 

나는 3 개 항목의 목록을 얻을 수 있습니다.

SQL 문 GROUP BY에 해당하는 NSPredicate를 제안 할 수 있습니까? UITableView에 채울 배열을 가져와야합니다.

답변

15

CoreData는 SQL 데이터 저장소가 아닌 객체 그래프 관리 프레임 워크입니다. 따라서 가능한 한 빨리 - SQL 사고 방식에서 벗어나야합니다. NSPredicate은 오브젝트 그래프에서 오브젝트를 규정하는 데있어 놀랄 - 서술어로 사용되지 않습니다. 따라서 쿼리와 일치하는 모든 개체를 가져올 수는 있지만 그 결과를 그룹화하는 것과 같지는 않습니다. 집계 연산을 수행하려면 키 - 값 코딩 collection operators을 사용하십시오. 후드 아래에서 코어 데이터 을 합리적인 SQL로 변환 할 수 있습니다. 그러나 이는 구현 세부 사항에만 해당됩니다. 이 경우

, 당신은 myCards 컬렉션 당신에게 packTitle 값의 고유 한 세트를 줄 것이다

[myCards valueForKeyPath:@"@distinctUnionOfObjects.packTitle"]; 

와 독특한 packTitle 값 세트를 얻을 수 있습니다. 핵심 데이터 저장소에있는 모든 카드에 대해이 값을 원하면 cards에 대한 쿼리를 실행 한 다음이 수집 작업을 적용해야합니다.

PackInformation 엔티티를 만들거나 title 속성을 포함하는 것도 있습니다. 그런 다음 해당 엔티티 중 3 개만 데이터 저장소에두고 적절한 팩 엔티티에서 참조 할 수 있습니다. 3 개 (또는 최종 번호가 무엇이든간에)를 가져 와서 제목을 얻는 것은 사소한 일입니다.

다른 사람들이 말했듯이, 당신이하려고하는 것이 근본적으로 관계형 데이터 세트로부터보고하는 것이라면, 곧바로 SQLite를 사용하는 것이 좋습니다. 이 모든 것은 Core Data에서 얻을 수있는 다른 이점의 정도에 달려 있습니다.

+0

이 질문에 대한 많은 관심과 관심에 감사드립니다. 그것은 당신의 대답을 이해하기 위해 핵심 가치 코딩을 배워야 할 것 같습니다. packTile이 PACK1 인 카드를 모두 지우는 것도 흥미 롭습니다. 희망은이 방향으로 움직이는 답을 찾을 수 있기를 바랍니다. – Michael

+0

NSPredicate 자체는 Core Data와 아무 관련이 없습니다. 배열 및 영역 같은 다른 데이터베이스와 함께 사용할 수 있습니다. 이것이 이것이 유효한 질문 인 이유이며 SQL과 비교해도 완벽합니다. – brainray

2

당신은 당신은 반드시 조건으로 "임의의"SQL 쿼리를 변환하거나 요청을 가져올 수 없습니다 Apple Documentation

에 따라 ... CoreData를 사용하는 가정. 방법은 페치 요청으로 에게 SQL 문 등

SELECT t1.name, V1, V2 
    FROM table1 t1 JOIN (SELECT t2.name AS V1, count(*) AS V2 
     FROM table2 t2 GROUP BY t2.name as V) on t1.name = V.V1 

변환, 예를 들어,이 없다. 관심 객체를 가져와야하고 이 결과를 사용하여 직접 계산을 수행하거나 배열 연산자를 사용해야합니다.

이렇게 복잡한 쿼리를 수행해야하는 경우 SQLite를 사용하는 것이 좋습니다.

+0

답장을 보내 주셔서 감사합니다. 그렇다면 결과를 가지고 작업해야합니다. – Michael

+0

반갑습니다. –

관련 문제