以下是我的数据库功能:
+(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?谢谢你!
答案 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];