2

以下是我的数据库功能:

+(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 where BMUrl like '%h%'”,返回了一些结果。所以,我猜错误是函数“bindString:forIndex”,代码是

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

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

4

1 回答 1

1

绑定不是这样插值的。如果您在字符串中加上引号,如 中'%?%',它将被解释为文字问号。

您应该修改您的输入_key

  • %转义和_的任何实例\
  • %首尾加s

这使它准备好与LIKE操作员一起使用。

您还需要修改 SQL 以使?代表独立参数:... where BMUrl like ?.


这是一个如何转义特殊字符并%在开头和结尾添加 s的示例_key

NSString *escapedKey = [_key stringByReplacingOccurencesOfString:@"%" 
                                                      withString:@"\\%"];
escapedKey = [escapedKey stringByReplacingOccurencesOfString:@"_"
                                                  withString:@"\\_"];
NSString *keyForLike = [NSString stringWithFormat:@"%%%@%%", escapedKey];
[stmt bindString:keyForLike forIndex:1];
于 2013-01-26T03:17:05.453 回答