내 상황은 간단합니다. 핵심 데이터 저장소에 일부 레코드가 있습니다. 속성 중 하나는 "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 .
블리메이! 나는 혼란 스럽다.
감사합니다.
힌트를 보내 주셔서 감사합니다! 나는 철저하게 철자 된 철자가 있는지 확인하겠습니다. 그러나이 문제는 몇 가지 속성에서 발생합니다. 그래서 더 근본적인 것이라고 생각합니다. 바라기를 나는 틀렸다! 윌 다시보고. 다시 한번 감사드립니다. – CharlieMezak
알다시피, 내 질문에 말했듯이 내가 가져 오기 요청에서 사용하려는 동일한 조건자를 사용하여 결과를 필터링 할 수 있기 때문에 이것은 문제가 될 수 없습니다. 그래서 술어 그 자체는 문제가 될 수 없습니다. 적어도 철자법은 아닙니다. 왜 결과 배열을 필터링 할 수 있지만 가져 오기 요청을 필터링하는 데는 술어가 유효하지 않습니까? – CharlieMezak
위의 코드는 정확히 동일한 술어를 표시하지 않습니다. 또한 NSManagedObject 하위 클래스를 정의한 경우 엔터티 속성 이름과 일치하지 않는 속성 이름을 만들 수 있습니다. 가져 오기는 배열의 술어가 클래스 특성 이름을 볼 때 엔티티 특성 이름을 찾습니다. – TechZen