2016-07-24 7 views
0

私はキーATTR1、ATTR2、ATTR3で(NSDictionary *レコード)を持っています。Objective C iOSでの文字列解析が効率的に

私はsql liteデータベースに適用する必要がある動的なwhere節を持っています。しかし、フェッチ要求を構築する前に、述部は "ATTR1 =%@ AND ATTR2 =%@ AND ATTR3 =%@"形式でなければなりません。また、静的な文字列whereClauseが "ATTR1 =:ATTR1とATTR2 =:ATTR2とATTR3 =:ATTR3"の形式で定義されています(注:このフォーマットは変更できません。動的には、 ":ATTR1"、 ":ATTR2"、 ":ATTR3"が上記の辞書変数レコードの値に置き換えられるべきであることを意味します。

述語を作成するには、フェッチ要求を実行するために作成する属性と属性の配列が必要です。

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

[ "ATTR1"、 "ATTR2"、 "ATTR3"]

私が見つけた解決策は、以下のようなものだった:

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つの余分な配列を使用し、1次ループの実行ごとにコンポーネントごとに分離するオーバーヘッドがあります。 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 –

関連する問題