2011-06-13 12 views
0

나는 CoreData에 의해 관리되는 객체의 목록을 가지고있다. CoreData에서 NSPredicate를 사용하여 특정 객체를 가져 오려고합니다. 아래 코드는 제가 사용하고있는 코드입니다. 배열 arr은 항상 그 안에 0 개의 객체가 있기 때문에 가져 오기가 술어와 일치하는 객체를 찾을 수 없기 때문일 수 있습니다. CoreData의 적어도 하나의 객체에 adUdid와 일치하는 advertisement.uuid가 있다는 사실을 알고 있습니다. 나는 수동으로 객체의 전체 목록을 가져 와서 그것을 스스로 검색하여 그것을 발견했다. advertisement는 WebServiceAuthService_mobileAdvertisementVO의 멤버이고 uuid는 광고의 멤버입니다. 더 정확히 말하자면,이 정확한 코드는 다른 프로젝트에서 잘 작동한다는 사실입니다. 이 코드가 새 프로젝트에서 더 이상 작동하지 않는 이유를 알아 내려고 실망했습니다.왜이 NSPredicate는 작동하지 않습니까?

이 코드는 내가 만든 정적 라이브러리에 중요합니다.

편집 : arr은 항상 비어 있으므로 게시 할 것이 없습니다. 또한 오류가 없습니다. 그저 작동하지 않습니다. uuids는 "9ca98efe-ef48-47c0-aff5-058224b3093d"줄을 따라 NSStrings입니다. 문제는 코드의 다른 부분에있을 수 있으며 여기에 그 자체가 나타납니다.

WebServiceAuthService_mobileAdvertisementVO *mobileAd = nil; 

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"WebServiceAuthService_mobileAdvertisementVO" inManagedObjectContext:managedObjectContext]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"advertisement.uuid == %@",adUdid]; 

[fetchRequest setEntity:entity]; 
[fetchRequest setPredicate:predicate]; 

NSError *error = nil; 
NSArray *arr = [managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
[fetchRequest release]; 

if (error) 
{ 
    DLog(@"fetched special ad error: %@",[error localizedDescription]); 
} 

if (arr && [arr count] >= 1) 
{ 
    DLog(@"found ad with UUID %@",adUdid); 
    for (WebServiceAuthService_mobileAdvertisementVO *obj in arr) 
    { 
     NSManagedObjectID *objID = [obj objectID]; 
     if (![objID isTemporaryID]) 
     { 
      mobileAd = obj; 
     } 
    } 
} 
+1

당신은 아마도 가게에서 그 실체의 일부 개체가는이 조건없이 요구를 가져 오기 실행 시도? 또한, 'adUdid'는 어디에서 왔습니까? 그것은 아닌가요? –

+0

Daniel adUdid가이 함수에 전달되었다는 것에 대해 유감스럽게 생각합니다. 프리디 케이트를 꺼낸 후 질문에 대답하기 위해 가져 오기가 6 개의 객체를 반환합니다. – iHorse

+0

흠, 나는 그것이 내 코드의 UUID와 대조하기 위해 사용하는 것처럼 ==의 문제라고 생각하지 않습니다. 질문에 오류 출력을 추가 할 수 있습니까? (있는 경우) 또는 'arr'출력 만 추가 할 수 있습니다. 마지막으로 광고의 예제를 제공 할 수 있습니다 .uuid, 값 및 클래스, (우리는 그것이 NSString *이라고 추정하고 있습니다). –

답변

0

문자열을 비교하는 경우 LIKE가 ==보다 나은 연산자입니다. 따라서 :

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"advertisement.uuid LIKE %@",adUdid]; 

따옴표를 염려하지 마십시오. predicateWithFormat :은 오른쪽 용어에 작은 따옴표를 자동으로 넣습니다.

편집 : 참조 : Predicate Programming Guide

+0

아니요.이 기능이 작동하지 않습니다. 내가 무엇을 얻는 지 CoreData가 만드는 sqlite DB를 수동으로 살펴 봤는데 내가 찾고있는 UUID를 가진 객체를 볼 수있다. – iHorse

+0

데이터 모델의 스크린 샷을 어떻게 든 게시 할 수 있습니까? 어딘가에 문자가없는 것처럼 바보 같을 수도 있지만 코드에서 말하는 것은 불가능합니다. –

+0

"LIKE"연산자에는 와일드 카드 기호가 필요합니다. '? '또는'*'문자가 없으면 여전히 "같음"비교를 수행 중입니다. –

관련 문제