2012-07-23 68 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