2016-07-24 2 views
0

ATTR1, ATTR2, ATTR3 키가있는 (NSDictionary * 레코드)가 있습니다.Objective C iOS에서 문자열 파싱이 효율적입니다.

나는 동적 인 where 절을 sql lite 데이터베이스에 적용해야한다. 그러나 가져 오기 요청을 작성하기 전에 술어는 "ATTR1 = % @ AND ATTR2 = % @ AND ATTR3 = % @"형식이어야합니다. 또한 정적 문자열 whereClause이 "ATTR1 = : ATTR1 및 ATTR2 = : ATTR2 및 ATTR3 = : ATTR3"형식으로 정의되어 있습니다 (참고 :이 형식은 변경할 수 없으며 고객의 프로덕션 서버에서 정의됩니다). 동적 인 말은 ": ATTR1", ": ATTR2", ": ATTR3"이 위에 언급 된 사전 변수 레코드의 값으로 대체되어야 함을 의미합니다.

따라서 술어를 만들려면 인출 요청을 실행하기 위해 다음 문자열 및 배열 속성을 만들어야합니다.

"ATTR1 = % @ AND ATTR2 = % @ AND ATTR3 = % @"

[ "ATTR1", "ATTR2", "ATTR3"] I 발견 용액 아래와 같았다

:

NSString * whereClause = @"ATTR1=:ATTR1 AND ATTR2=:ATTR2 AND ATTR3=:ATTR3"; 
NSArray * primaryTokens = [whereClause componentsSeparatedByString: @":"]; 
NSUInteger primaryTokenCount = [primaryTokens count]; 
NSMutableString * finalWhereClause = [[NSMutableString alloc] initWithString:primaryTokens[0]]; 
NSMutableArray * attributes = [[NSMutableArray alloc]init]; 
if(primaryTokenCount >1) 
{ 
    for(int i=0;i<(primaryTokenCount-1);i++){ 
     NSArray * secondaryTokens = [primaryTokens[i+1] componentsSeparatedByString: @" "]; 
     NSUInteger secondaryTokenCount = [secondaryTokens count]; 
     if(secondaryTokenCount > 1) 
     { 
      [finalWhereClause appendString:@"%@"]; 
      NSArray * newSecondaryArray = [secondaryTokens subarrayWithRange:NSMakeRange(1,[secondaryTokens count]-1)]; 
      [finalWhereClause appendString:@" "]; 
      [finalWhereClause appendString:[newSecondaryArray componentsJoinedByString:@" "]]; 
     } 
    [attributes addObject:secondaryTokens[0]]; 
    } 
[finalWhereClause appendString:@"%@"]; 
} 
NSLog(@"THE FINAL PARSED STRING IS : %@",finalWhereClause); 
NSLog(@"THE FINAL ATTRIBUTES IS : %@",[attributes componentsJoinedByString:@","]); 

위의 코드가 작동합니다. 그러나 3 개의 추가 배열을 사용하고 기본 루프가 실행될 때마다 구성 요소로 분리되는 오버 헤드가 있습니다. Objective C에서이 여분의 저장 영역을 넘나 드는 것을 피하기 위해이 구문 분석을 수행하는 효율적인 방법이 있습니까? 이 방법은 광범위하게 호출됩니다. 따라서 어떤 도움을 주시면 감사하겠습니다.

답변

1
NSString *whereClause = @"ATTR1=:ATTR1 AND ATTR2=:ATTR2 AND ATTR3=:ATTR3"; 
NSString *finalWhereClause = whereClause; 

NSArray *clauseComponents = [whereClause componentsSeparatedByString: @" "]; 
NSMutableArray *attributes = [NSMutableArray new]; 

for (NSString *component in clauseComponents) { 

    if ([component containsString:@":"]) { 

     NSString *paramName = [component substringFromIndex:[component rangeOfString:@":"].location + 1]; 
     [attributes addObject:paramName]; 


     NSString *separatedParamName = [@":" stringByAppendingString:paramName]; 
     finalWhereClause = [finalWhereClause stringByReplacingOccurrencesOfString:separatedParamName withString:@"%@"]; 

    } 

} 

NSLog(@"THE FINAL PARSED STRING IS : %@",finalWhereClause); 
NSLog(@"THE FINAL ATTRIBUTES IS : %@",[attributes componentsJoinedByString:@","]); 
+0

추가 솔루션을 사용하는 것보다 훨씬 낫습니다. 그러나 LIKE 쿼리의 이러한 상황을 해결할 수있는 방법이 있습니까? 입력 whereClause : ATTR1 = : ATTR1과 ATTR2 LIKE '% : ATTR2 %'및 ATTR2 = : ATTR4 및 ATTR3 = : ATTR3. 출력은 다음과 같습니다. ATTR1 = % @ AND ATTR2 LIKE '%% @ AND ATTR2 = % @ AND ATTR3 = % @ 속성 : ATTR1, ATTR2 %', ATTR4, ATTR3 –

관련 문제