Predicate Basics

OSXDEV

Jump to: navigation, 찾기

Predicates Programming Guide로 이동


Cocoa predicates provide a means of encoding queries in a manner independent of the backing store used to hold the data being searched. You use predicates to represent logical conditions used for constraining the set of objects retrieved by Spotlight and Core Data, and for in-memory filtering of objects.

[편집] Predicates

Predicate에는 두가지 종류, comparison과 compound이있다.Comparison 프리디케이트는 두개의 표현을 비교할 때 사용된다.Comparison 프리디케이트는 왼쪽 공식과 오른쪽 공식 그리고 연산자로 구성되며 연산자를 수행한 결과를 공식들을 평가한 결과와 함께 리턴한다. Compound 프리디케이트는 논리적 연산자(AND 혹은 OR) 혹은 네거티브 프리디케이츠(NOT)을 이용해 두 개 이상의 프리디케이트를 조합한다.

Comparison 프리디케이트와 compound 프리디케이트는 각각 NSComparisonPredicate와 NSCompoundPredicate의 인스턴스로서 코코아에 있다.둘 다 NSPredicate로부터 상속했다.

코코아는 다음을 포함하여, 광범위한 프리디케이트의 타입을 지원한다:

  • grade ==7 또는 firstName like 'Mark'처럼 단순한 comparison.
  • name contains[cd] 'citroen'과 같이 대소문자를 구별하지 않는 검색.
  • (firstName beginswith 'M') AND (lastName like 'Adderley')과 같은 논리적 연산.

group.name matches 'work.*', ALL children.age > 12, 그리고 ANY children.age > 12와 같이 릴레이션십을 위한 프리디케이트와 @sum.items.price < 10000과 같이 연산을 위한 프리디케이트를 만들 수 있다.

어떤 클래스의 오브젝트로근 프리디케이트를 만들 수 있지만, 클래스는 프리디케이트에서 사용하려 하는 키에 대해서 반드시 키-값 코딩에 호환되어야 한다 ( Key-Value Coding Programming Guide를 보라).

[편집] Expressions

코코아에서의 프리디케이트 공식은 NSExpression의 인스턴스로 나타난다. 가장 간단한 표현은 다음 예와 같이 단순히 상수 값을 나타낸다.

NSExpression *expression = [NSExpression expressionForConstantValue:[NSDecimalNumber numberWithInt:10]];

다음과 같이 현재 프리디케이트를 이용해 평가하고 있는 오브젝트의 키 패스로부터 값을 추출해 내는 공식을 주로 사용할 것이다.

NSExpression *expression = [NSExpression expressionForKeyPath:@"lastName"];

다양한 바인딩 딕셔네리로부터 추출되는 변수에 대한 placeholder 역할을 하거나 어레이에 연산을 수행한 결과를 리턴하기 위해서, 프리디케이가 현재 평가하고 있는 오브젝트를 나타내기 위한 공식을 만들 수 있다.다음 예제처럼.

NSExpression *expression = [NSExpression expressionForFunction:@"max" arguments:anArray];

expression은 현재 확장 불가능하다.

[편집] Constraints and Limitations

코어 데이터나 스팟라이트 에서 프리디케이트를 사용한다면, 그것들이 데이터 스토어를 이용한다는 것을 명심해야 한다. 프리디케이트 쿼리를 수행하기 위한 특정 언어는 없다 - 프리디케이트 쿼리는 backing store(가 있다면)의 요구에 따라 SQL, XML외의 다른 포맷으로 변환가능하다.


프리디케이트 시스템은 유용한 범위내에서 연산자를 지원하려 하기 때문에 , 모든 backing store에서 지원되고 있는 연산자의 교집합과 합집합은 지원하지 않는다. 그러므로, 모든 프리디케이트 쿼리가 모든 종류의 backing store에서 지원되는 것은 아니며, 모든 backing store에서 지원하는 연산들이 NSPredicate와 NSExpression으로 표현가능한 것은 아니다. 뒤에 가서는 지원되지 않는 연산자를 사용하려 할 때는 프리디케이트를 다운그레이드하거나( 예를 들어 대소문자 구분하는 비교를 대소문자 구분 못하도록 하는) 예외상황을 발생시킨다. 예를 들면 :

  • matches오퍼레이터는 regex를 사용하므로 메모리-내의 필터링은 지원하지만 CoreData의 SQL스토어는 지원하지 않는다.
  • Core Data SQL 스토어는 쿼리당 one to many 연산만 지원하므로 SQL스토어로 보내는 모든 프리디케이트는 ALL, ANY, IN중 하나의 연산(그리고 해당 연산자의 하나의 인스턴스)만 지원한다.
  • "abritrary" SQL 쿼리를 프리디케이트로 해석 해야 할 필요는 없다.
  • ANYKEY 오퍼레이터는 스팟라이트에서만 사용할 수 있다.
  • 스팟라이트는 relationship을 지원하지 않는다.