为什么我的sqlite sql没有返回结果?

时间:2013-01-26 03:09:59

标签: sql macos sqlite

以下是我的数据库功能:

+(NSArray*)searchWithKey:(NSString*)_key{
NSMutableArray* tmpArray = [NSMutableArray array];
static Statement* stmt = nil;
char* sql = "select * from Bookmarks where BMUrl like '%?%'";
if (stmt == nil) {
    stmt = [DBConnection statementWithQuery:sql];
    [stmt retain];
}
[stmt bindString:_key forIndex:1];
while ([stmt step] == SQLITE_ROW) {
    BookMark* tmpBM = [[BookMark alloc] initWithStatement:stmt];
    NSLog(@"tmpBM = %@",tmpBM);
    [tmpArray addObject:tmpBM];
    [tmpBM release];
}
[stmt reset];
return tmpArray;}

sql的关键字是“like”我使用的。但是没有sqlite返回的结果。任何人都可以告诉我为什么? 我将sql更改为“select * from Bookmarks,其中BMUrl喜欢'%h%'”,有一些结果被返回。所以,我猜错误是函数“bindString:forIndex”,代码是

- (void)bindString:(NSString*)value forIndex:(int)index{
sqlite3_bind_text(stmt, index, [value UTF8String], -1, SQLITE_TRANSIENT);}

我将使用哪个正确的sqlite3 api?谢谢你!

1 个答案:

答案 0 :(得分:1)

绑定不是这样插值的。如果在字符串中加上引号,如'%?%'中所示,则会将其解释为文字问号。

您应该修改输入_key

  • 使用%
  • 撤消_\的所有实例
  • 在开头和结尾添加%

这使它准备好与LIKE运算符一起使用。

您还需要修改SQL,以便?代表一个独立的参数:... where BMUrl like ?


以下是如何转义特殊字符并在%的开头和结尾添加_key的示例:

NSString *escapedKey = [_key stringByReplacingOccurencesOfString:@"%" 
                                                      withString:@"\\%"];
escapedKey = [escapedKey stringByReplacingOccurencesOfString:@"_"
                                                  withString:@"\\_"];
NSString *keyForLike = [NSString stringWithFormat:@"%%%@%%", escapedKey];
[stmt bindString:keyForLike forIndex:1];