2011-03-23 1 views
8

내 상황은 간단합니다. 핵심 데이터 저장소에 일부 레코드가 있습니다. 속성 중 하나는 "localId"라는 문자열입니다. 특정 localId 값으로 레코드를 찾고 싶습니다. 이를 수행하는 확실한 방법은 NSFetchRequest와 NSPredicate를 사용하는 것입니다. 그러나 이것을 설정하면 요청은 0 레코드를 반환합니다.NSPredicate는 가져 오기 요청으로 결과를 반환하지 않으며 배열 필터링과 함께 작동합니다.

그러나 술어없이 모든 레코드를 반환하고 대상 localId 값을 찾기 위해 루프를 반복하면 내가 찾고있는 레코드를 찾습니다. 즉, 레코드가 있지만 가져 오기 요청에서 찾을 수 없습니다.

내가 가져 오기 요청과 조건자를 사용하는 다른 방법은 모두 예상대로 작동합니다. 나는 왜 이것이 실패하고 있는지 모른다.

나는이하고 싶은 :

- (void)deleteResultWithLocalID:(NSString *)localId { 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:[NSEntityDescription entityForName:@"WCAAssessmentResult" inManagedObjectContext:context]]; 
    [request setPredicate:[NSPredicate predicateWithFormat:@"localId == %@", localId]]; 
    NSError *error = nil; 
    NSArray *results = [context executeFetchRequest:request error:&error]; 
    NSAssert(error == nil, ([NSString stringWithFormat:@"Error: %@", error])); 
    if ([results count]) [context deleteObject:[results objectAtIndex:0]]; 
    else NSLog(@"could not find record with localID %@", localId); 
    [self saveContext]; 
} 

을하지만이 작업을 수행하는 데 결국 : 잘못 갈 수 무엇인지에

- (void)deleteResultWithLocalID:(NSString *)localId { 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:[NSEntityDescription entityForName:@"WCAAssessmentResult" inManagedObjectContext:context]]; 
    NSError *error = nil; 
    NSArray *results = [context executeFetchRequest:request error:&error]; 
    NSAssert(error == nil, ([NSString stringWithFormat:@"Error: %@", error])); 
    for (WCAAssessmentResult *result in results) { 
     if ([result.localId isEqualToString:localId]) { 
      NSLog(@"result found, deleted"); 
      [context deleteObject:result]; 
     } 
    } 
    [self saveContext]; 
} 

모든 단서?

나는 내가 페치 요청이 실행 된 후 내가 기대하는 결과를 얻을 수 있도록 만드는거야 술어를 사용할 수있는 것으로 나타났습니다

편집. 그래서, 다음은 작동 : 그 중 하나 해결책을 발견하지

http://markmail.org/message/7zbcxlaqcgtttqo4

: 나는 다른 사람이 아주 문제가 발생 사람 건너 한

- (WCAChecklistItem *)checklistItemWithId:(NSNumber *)itemId { 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:[NSEntityDescription entityForName:@"WCAChecklistItem" inManagedObjectContext:context]]; 
    NSArray *foundRecords = [context executeFetchRequest:request error:nil]; 
    foundRecords = [foundRecords filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"serverId == %@", itemId]]; 
    if ([foundRecords count]) { 
     return [foundRecords objectAtIndex:0]; 
    } else { 
     NSLog(@"can't find checklist item with id %@", itemId); 
     return nil; 
    } 
} 

UPDATE .

블리메이! 나는 혼란 스럽다.

감사합니다.

답변

1

싫은 것은 있지만이 유형의 문제의 가장 일반적인 원인은 간단한 오타입니다. 속성 이름과 술어가 동일한지 확인하십시오. 속성 이름과 속성 이름이 같은지 확인하십시오. 속성에 대한 참조가 작동하지만 속성 이름에 대한 참조가 일치하지 않는 경우 일 수 있습니다. 의 반환에 ...

[result valueForKey:@"localID"] 

:

는 당신의 반환을 비교하여 후자를 테스트 할 수

result.localID 
+0

힌트를 보내 주셔서 감사합니다! 나는 철저하게 철자 된 철자가 있는지 확인하겠습니다. 그러나이 문제는 몇 가지 속성에서 발생합니다. 그래서 더 근본적인 것이라고 생각합니다. 바라기를 나는 틀렸다! 윌 다시보고. 다시 한번 감사드립니다. – CharlieMezak

+0

알다시피, 내 질문에 말했듯이 내가 가져 오기 요청에서 사용하려는 동일한 조건자를 사용하여 결과를 필터링 할 수 있기 때문에 이것은 문제가 될 수 없습니다. 그래서 술어 그 자체는 문제가 될 수 없습니다. 적어도 철자법은 아닙니다. 왜 결과 배열을 필터링 할 수 있지만 가져 오기 요청을 필터링하는 데는 술어가 유효하지 않습니까? – CharlieMezak

+0

위의 코드는 정확히 동일한 술어를 표시하지 않습니다. 또한 NSManagedObject 하위 클래스를 정의한 경우 엔터티 속성 이름과 일치하지 않는 속성 이름을 만들 수 있습니다. 가져 오기는 배열의 술어가 클래스 특성 이름을 볼 때 엔티티 특성 이름을 찾습니다. – TechZen

4

localId이 숫자 일 경우 NSString 대신 술어 형성에서 NSNumber 개체를 사용해야합니다.

[request setPredicate:[NSPredicate predicateWithFormat:@"localId == %@", 
    [NSNumber numberWithString:localId]]]; 

NSPredicate 형식 문자열은 자동으로 NSString 개체를 인용합니다.

+0

감사합니다!좋은 지적이지만 localId는 문자열 값입니다. 그래서 나는 그것이 문제라고 생각하지 않는다. 나는 그 질문을 명확하게하기 위해 나의 질문을 편집 할 것이다. – CharlieMezak

+1

그리고 이제 문제는 문자열과 숫자 값 모두에 대한 내 예측 된 가져 오기 요청에 공통적으로 보인다! AArrg! – CharlieMezak