IT TIP

대다 관계에서 NSPredicate 대소 문자를 구분하지 않는 일치

itqueen 2020. 11. 19. 22:45
반응형

대다 관계에서 NSPredicate 대소 문자를 구분하지 않는 일치


사용자가보기에 표시된 항목을 필터링하기 위해 문자열을 입력 할 수있는 검색 필드를 구현하고 있습니다. 표시되는 각 개체에는 keywords대다 관계가 있으며 키워드를 기반으로 개체를 필터링 할 수 있기를 바랍니다. 각 키워드 객체에는 name속성이 있으므로 다음과 같은 필터링을 수행하도록 NSPredicate를 설정했습니다.

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS %@", self.searchString];

이것은 작동하지만 문제는 검색이 대소 문자를 구분하므로 키워드에 대문자가 있지만 사용자가 모두 소문자로 입력하면 일치하는 항목이 없다는 것입니다. 다음 수정을 시도했습니다.

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS[c] %@", self.searchString];

그러나 일치의 대소 문자 구분에 차이가 없습니다. 일반 조건자를 사용하여 대소 문자를 구분하지 않는 일치를 수행하는 방법이 있습니까? 아니면 키워드 클래스에 대해 일종의 사용자 지정 접근자를 구현해야 lowercaseName합니까? 예를 들어 메서드를 작성하고 대신 검색 문자열의 소문자 버전과 일치 시켜야 합니까?

부록 : 추가 탐색 후 사용자 지정 접근자를 추가하는 해결 방법은 NSPredicate의 수동 사용에 대해 정상적으로 작동하지만 코어 데이터와 함께 NSFetchRequest를 사용할 때는 전혀 작동하지 않습니다. 이는 코어 데이터 모델에 정의 된 속성을 쿼리 할 때만 작동합니다.


내가 당신을 올바르게 이해한다면, 키워드 이름이 검색 문자열과 일치 할 때마다 조건자가 참이되기를 원합니다. 이를 위해 다음과 같은 ANY 키워드로 테스트해야합니다.

[NSPredicate predicateWithFormat:@"ANY keywords.name CONTAINS[c] %@", ...];

그러면 키워드를 검색하고 해당 키워드 이름에 검색 문자열이 포함 된 경우 true를 반환합니다.


대답은 다음과 같습니다.

[NSPredicate predicateWithFormat:@"keywords.name CONTAINS[cd] %@", self.searchString];

문자열 비교는 기본적으로 대소 문자를 구분하며 구별 부호를 구분합니다. 대괄호 안에있는 키 문자 c 및 d를 사용하여 연산자를 수정하여 각각 대소 문자 구분 부호 구분을 지정하지 않습니다 (예 : firstName BEGINSWITH [cd] $ FIRST_NAME).

술어 형식 문자열 구문


대소 문자를 구분하지 않고 같음 이름 만 잡으려고한다면 최선의 해결책이라고 생각합니다.

[NSPredicate predicateWithFormat:@"ANY keywords.name LIKE[c] %@", ...];

당신은 나를 많이 도왔습니다. 감사합니다 !!!

제 경우에는 다음과 같이했습니다.

[NSPredicate predicateWithFormat:@"ANY name LIKE[c] %@", @"teste"];

키워드와 일치해야하지만 검색시 대소 문자 구분해야하는 경우 다음을 사용해야합니다.NSPredicate(format: "keywords.name =[c] %@", self.searchString)

LIKE 문자열 리터럴에서는 작동하지 않습니다.


대소 문자를 구분하지 않고 와일드 카드를 사용하려면 다음을 사용하십시오.

NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(name like[c] '*%@*')",@"search"]];

참고 URL : https://stackoverflow.com/questions/1473973/nspredicate-case-insensitive-matching-on-to-many-relationship

반응형