2012-07-23 82 views
1

我正在尋找一種在iOS應用程序中調試我的SQLite查詢的快速方法。我有這樣的事情:將NSString中的匹配項替換爲NSArray中的匹配項

NSString *sql = [NSString stringWithString: @"SELECT * FROM table WHERE foo = ? AND bar = ?"]; 
NSArray *params = [NSArray arrayWithObjects: @"baz", @"bat", nil]; 
NSLog(@"%@ %@", sql, params); 

我想知道如果有一個或兩個班輪與PARAMS替換問號,使輸出更具可讀性。我是不是尋找的東西,輸出有效的SQL,而是比我目前的NSLog更容易閱讀。

回答

1
@interface NSString (SQLQueryDebugging) 
- (NSString *)stringBySubstitutingParameters:(NSArray *)params forInstancesOfPlaceholder:(NSString *)placeholder; 
@end 

@implementation NSString (SQLQueryDebugging) 

- (NSString *)stringBySubstitutingParameters:(NSArray *)params forInstancesOfPlaceholder:(NSString *)placeholder 
{ 
    NSString *composedQuery = self; 
    NSRange substitutionRange = [composedQuery rangeOfString:placeholder]; 
    NSInteger parameterIndex = 0; 
    while(substitutionRange.length != 0) 
    { 
     NSString *currentParam = [params objectAtIndex:parameterIndex]; 
     composedQuery = [composedQuery stringByReplacingCharactersInRange:substitutionRange withString:currentParam]; 
     ++parameterIndex; 
     NSInteger lastSubstitutionIndex = substitutionRange.location + [currentParam length]; 
     NSRange searchRange = NSMakeRange(lastSubstitutionIndex, [composedQuery length] - lastSubstitutionIndex); 
     substitutionRange = [composedQuery rangeOfString:placeholder options:0 range:searchRange]; 
    } 

    return composedQuery; 
} 

下降,在某個地方,那麼你就可以得到你想要什麼:

NSString *completeSQL = [sql stringBySubstitutingParameters:params forInstancesOfPlaceholder:@"?"]; 
+0

爲起點的Objective-C開發者,我還沒有真正使用分類爲許多機會。這是一個很好的例子!我不得不稍微修改一下,以便當currentParam是一個NSNumber時添加一個檢查。由於這總是期望一個字符串,它會崩潰。除此之外,這是一個完美的單線!謝謝! – Julian 2012-07-23 20:59:01

+0

很高興爲您工作。我想過你可能有非字符串參數的情況,並且幾乎建議你在適當的地方使用'[currentParam description]'而不是'currentParam'。很高興你自己想出來:) – warrenm 2012-07-23 21:34:01