2014-01-21 2 views
2

저는 핵심 데이터 프로젝트가 있고 간단한 계산 필드로 데이터를 검색하는 데 어려움이 있으며 왜 작동하지 않는지 전혀 모릅니다.NSPredicate가 계산 된 필드와 함께 작동하지 않습니다.

핵심 데이터 문자열 속성이 "tutorFirstName"및 "tutorLastName"인 Tutor 엔터티가 있습니다. 내가 같은 범주에 채워집니다 추가 문자열 속성 "tutorFullName"를 만들었습니다

NSString *fullName = [@[self.tutorFirstName, self.tutorLastName] componentsJoinedByString:@" "]; 

데이터입니다 인구가 좋은,하지만 난 다음 검색한다 tutorFirstName 및 tutorLastName 작업에만 술어를 수행 할 때 :

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tutorFirstName = %@", @"Sean"]; 
[fetchRequest setPredicate:predicate]; 
NSArray *fetchedObjects = [moc executeFetchRequest:fetchRequest error:&error]; 
NSLog(@"Search on %@ returned %lu items (%@)",predicate, (unsigned long)fetchedObjects.count, [fetchedObjects objectAtIndex:0]); 

predicate = [NSPredicate predicateWithFormat:@"tutorFullName = %@", @"Sean Silverman"]; 
[fetchRequest setPredicate:predicate]; 
fetchedObjects = [moc executeFetchRequest:fetchRequest error:&error]; 
NSLog(@"Search on %@ returned %lu items",predicate, (unsigned long)fetchedObjects.count); 

predicate = [NSPredicate predicateWithFormat:@"tutorLastName = %@", @"Silverman"]; 
[fetchRequest setPredicate:predicate]; 
fetchedObjects = [moc executeFetchRequest:fetchRequest error:&error]; 
NSLog(@"Search on %@ returned %lu items (%@)",predicate, (unsigned long)fetchedObjects.count, [fetchedObjects objectAtIndex:0]); 

여기에는 각 검색 결과를 보여주는 디버그 코드가 있으며 결과 코어 데이터 객체에는 올바른 tutorFullName 항목이 있습니다. "(나에게 이상한 것 같다

2014-01-21 14:05:26.129 AT Data[54935:70b] Search on tutorFirstName == "Sean" returned 1 items (<Tutor: 0x113b16830> (entity: Tutor; id: 0xd0000000041c0006 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Tutor/p263> ; data: { 
charges =  (
    "0xd000000581b40002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p90221>", 
    "0xd00000058b280002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p90826>", 
    "0xd00000057d4c0002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p89939>", 
    "0xd0000005994c0002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p91731>", 
    "0xd000000593c40002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p91377>", 
    "0xd0000005aa3c0002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92815>", 
    "0xd0000005ab440002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92881>", 
    "0xd0000005aa500002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92820>", 
    "0xd00000057ea00002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p90024>", 
    "0xd0000005a7000002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92608>", 
    "(...and 595 more...)" 
); 
tutorFirstName = Sean; 
tutorFullName = "Sean Silverman"; 
tutorLastName = Silverman; 

2014-01-21 14:05:26.130 AT Data[54935:70b] Search on tutorFullName == "Sean Silverman" returned 0 items 

2014-01-21 14:05:26.131 AT Data[54935:70b] Search on tutorLastName == "Silverman" returned 1 items (<Tutor: 0x113b16830> (entity: Tutor; id: 0xd0000000041c0006 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Tutor/p263> ; data: { 
charges =  (
    "0xd000000581b40002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p90221>", 
    "0xd00000058b280002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p90826>", 
    "0xd00000057d4c0002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p89939>", 
    "0xd0000005994c0002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p91731>", 
    "0xd000000593c40002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p91377>", 
    "0xd0000005aa3c0002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92815>", 
    "0xd0000005ab440002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92881>", 
    "0xd0000005aa500002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92820>", 
    "0xd00000057ea00002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p90024>", 
    "0xd0000005a7000002 <x-coredata://B8C4C087-A68F-4CA6-935D-F596CB1E9D0C/Charge/p92608>", 
    "(...and 595 more...)" 
); 
tutorFirstName = Sean; 
tutorFullName = "Sean Silverman"; 
tutorLastName = Silverman; 

유일한 것은 기업의 디버그 출력에, 엄격한 핵심 데이터 속성은 문자열 값 주위에 따옴표가없는 것을, 그러나 계산 된 속성은 않습니다 Sean Silverman ")하지만 계산 된 속성에 공백이있을 수 있습니다.

도움을 주시면 감사하겠습니다.

답변

9

계산에 따르면,이 속성이 일시적이라고 가정합니다. 이 경우 해당 속성을 검색 할 수 없습니다. 이는 검색중인 모든 핵심 데이터 엔티티에 대해 검색이 실행될 때 속성이 만들어지지 않을 수 있기 때문입니다. Core Data Programming Guide에서 (단지 목록 1 이후) :

당신은 (당신이 메모리 자신을 필터링하는 과도 특성을 사용할 수 있지만) 과도 특성을 기반으로 술어를 사용하여 가져올 수 없습니다.

따라서 속성을 필터링하기 위해 조건자를 사용하려면 속성을 일시적으로 만들어야합니다.

+0

동의 함. @OP에 이름과성에 단순히 AND 연산자를 사용하지 않는 이유는 무엇입니까? –

+0

전체 이름을 받고있는 중 AND 솔루션을 피하려고했는데 일부 이름에 공백이있는 이름 (예 : Mary Jane Smith, Mary Jane 이름은 메리 스미스 페리입니다. 스미스 페리는 성입니다. – user3220687

+0

좋아요, 나는 AND 솔루션으로 전환하고 제 간격 문제에 대한 해결 방법을 만들었습니다. 내가 한 것은 공백을 #으로 바꾸어서 이름과 성을 인코딩 한 다음 인쇄 된 값이 필요할 때 디코드했습니다. 내 이름에 #이 없다면 괜찮을거야. – user3220687

관련 문제