您最后一次尝试(不带任何引号)是正确的语法。您是否正在检查是否results
为非nil
?如果nil
是,您应该检查错误字符串。例如,这有效:
NSString *searchString = @"larry";
NSString *likeParameter = [NSString stringWithFormat:@"%%%@%%", searchString];
NSString *sql = @"SELECT text_column FROM test WHERE text_column LIKE ?";
FMResultSet *results = [db executeQuery:sql, likeParameter];
if (!results)
{
NSLog(@"error: %@", [db lastErrorMessage]);
[db close];
return;
}
while ([results next])
{
NSLog(@"%s: %@", __FUNCTION__, results[0]);
}
[results close];
[db close];
顺便说一句,如果您很特别,并且您不希望最终用户操纵参数或获得不直观的响应(并且您不希望最终用户应用自己的通配符),您可能希望避免出现使用SQL 语法的通配符,例如%
or 。因此,您可能希望为转义字符定义一个常量:_
ESCAPE
NSString * const kEscapeCharacter = @"\\";
然后,像这样构建你的 SQL:
NSString *likeParameter = [NSString stringWithFormat:@"%%%@%%", [self escapedLikeParameter:searchString]];
NSString *sql = [NSString stringWithFormat:@"SELECT text_column FROM test WHERE text_column LIKE ? ESCAPE '%@'", kEscapeCharacter];
在哪里escapedLikeParameter
转义%
,_
和通配符本身。因此:
- (NSString *)escapedLikeParameter:(NSString *)string
{
NSString *escapedString;
escapedString = [string stringByReplacingOccurrencesOfString:kEscapeCharacter
withString:[NSString stringWithFormat:@"%@%@", kEscapeCharacter, kEscapeCharacter]];
escapedString = [escapedString stringByReplacingOccurrencesOfString:@"_"
withString:[NSString stringWithFormat:@"%@_", kEscapeCharacter]];
return [escapedString stringByReplacingOccurrencesOfString:@"%"
withString:[NSString stringWithFormat:@"%@%%", kEscapeCharacter]];
}
这样,您可以搜索任何字符串,包括具有多字符通配符/
. 或单字符通配符 . 的字符串_
。