2013-06-22 2 views
1

코어 데이터 클래스 인 SSSLicense에는 이름 및 유형과 같은 속성이 있습니다. isArchived라는 부울 속성을 가진 SSSArchivableEntity라는 추상 엔티티를 상속합니다.NSPredicate가 코어 데이터의 추상 엔티티 속성과 함께 작동하지 않습니다.

DB에서 라이센스 엔티티 전체를 이미 가져 왔으며 type 및 isArchived 플래그를 기반으로 필터링하려고합니다. 그러나 내 술어의 많은 변형에도 불구하고 유효한 결과를 얻을 수는 없습니다.

가 여기에 관련 코드입니다 :

NSSet *licenses = [person licenseList] ; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(licenseType like %@) AND (isArchived == NO)", 
          lType]; 
NSSet *filteredLicenses = [licenses filteredSetUsingPredicate:predicate]; 

내가 SSSLicense의 또 다른 속성을 이용할 수 있도록 조건을 변경하는 경우

는, 이름 (대신 isArchived의) 말, 술어 작동합니다. SSSLicense에 간단한 부울 속성을 추가하고이를 성공적으로 사용하여 필터링했습니다.

isArchived가 추상 엔티티의 속성이라는 사실과 관련이있는 것으로 보입니다. 계승 된 속성으로 필터링하기 위해해야 ​​할 특별한 것이 있습니까?

감사합니다.

+0

특성의 이름을 바꾸어보십시오. 일부 특성 이름은 NSManagedObject의 기본 제공 속성과 충돌합니다. –

+0

고마워,하지만 그건 작동하지 않았다. 나는 속성의 이름을 'fred'로 바꿨지 만, 여전히 같은 결과를 얻는다. –

+0

'NSPredicate'는 NSString이 아니므로 술어에'% K'와'% @'형식 지정자를 사용해야하는 방법에 대해 더 알아야합니다. 그렇지 않으면 블록으로 된 술어를 만들 수 있습니다 훨씬 편안해. – holex

답변

0

문제는 술어가 조건을 테스트하는 방법 중 하나가 될 밝혀 if 문을 통한 직접 테스트와 비교합니다. 내 시드 데이터는 직접 설정 호출을 통해 라이센스를 생성했으며 명시 적으로 isArchived를 NO로 설정하지 않았습니다. 앱 내에서 라이선스가 생성되었을 때 설정되었습니다. 따라서 시드 데이터는 술어를 통해 반환되지 않았습니다. 그러나 수동으로 설정을 반복하고 "[license isArchived] == NO"를 통해 테스트를 수행하면 시드 데이터와 앱 데이터가 모두 예상대로 반환됩니다.

내 생각에 직접 부울 테스트에서는 유효한 'YES'가 있는지 확인하고없는 경우에는 NO로 가정하고 있지만 조건부는 YES = 1 NO = 0 (또는 표현되어 있음)을 명시 적으로 확인합니다.

0

아마도 값을 하드 코딩해도 작동하지 않습니다. 나는 표준 구문을 사용하는 것이 좋습니다 :

[NSPredicate predicateWithFormat: 
    @"(licenseType like %@) && (isArchived = %@)", lType, @(NO)]; 

를이 내가 수동으로 파이어 폭스에서 sqlite3 명령 행 도구 또는 SQLite는 관리자 플러그인을 통해 isArchived 속성 값을 확인 할 작동하지 않는 경우. 어쩌면 당신은 거기에 가치가있을 것으로 기대하고 있습니다.

모든 검증하는 경우 당신이 은 술어가 실제로 작동하지만 잘못된 값을 표시 잘못된 값이나 을 읽는 것을 수 있습니다.

+0

고마워, 위의 시도했지만 여전히 작동하지 않습니다. 유효한 값이 있다는 것을 알고 있기 때문에 getter 메서드를 호출하여 해당 값에 대해 수동으로 (조건자를 사용하지 않고) 집합의 개체를 테스트하는 코드에 디버그 문을 추가 했으므로 올바른 값이 있음을 알았습니다. 올바른 YES/NO 값을 보여줍니다. –

+0

내 편집에서 한 단계 더. – Mundi

+0

술어가 0 개의 객체를 반환하므로 이해할 수 없습니다. 코드를 변경하고 추상 엔티티의 부울을 구체 엔티티로 직접 이동하면 조건자를 사용할 수 있습니다. 내가 테스트 한 속성이 술어가 결과를 리턴하지 않는 추상 엔티티에만있는 경우에만 해당됩니다. –

0

차라리 원합니다 더 블록 대신 형식의, 따라서 나는 이런 식으로 뭔가를 시도 할 것입니다 :

[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { 
    return ([[evaluatedObject licenseType] rangeOfString:lType].location == NSNotFound && [[evaluatedObject isArchived] boolValue] == NO); 
}]; 
관련 문제