使用SQLite“like”子句查找类似单词的SQLite查询

时间:2010-11-17 07:25:01

标签: iphone objective-c ios4 sqlite

在我的iPhone应用程序中,我需要搜索SQLite数据库。

我将根据用户输入文本框的内容搜索类似的数据。

我想要的是什么:

我想查询

从类别表中选择类别,其中类别为“A%”,如果用户输入A

我试过

NSString *query = [NSString stringWithFormat:@"Select category from categorytable where category like '%@%'",textbox1.text];

在用户输入的字符后不显示“%”。

在控制台中,它显示为

**Select category from categorytable where category like 'A'**  which is incorrect

查询应该是什么?

3 个答案:

答案 0 :(得分:2)

字符串格式说明符文档说明如果您希望%文字字符出现在最终字符串中,则应在格式字符串中使用%%。所以你应该使用'%@%%'

答案 1 :(得分:2)

您需要在stringWithFormat中使用%%。

答案 2 :(得分:0)

正如其他人所说,在%%中使用stringWithFormat语法让字面百分号出现在搜索字符串中。但是,不要用你的SQL做到这一点。只有价值才能做到这一点。应该避免使用stringWithFormat将文本值直接插入SQL。而是在SQL中使用?占位符:

NSString *value = [NSString stringWithFormat:@"%@%%", textbox1.text];

NSString *query = @"Select category from categorytable where category like ?";

然后使用sqlite3_stmt准备query,然后使用sqlite3_bind_text准备value。例如:

sqlite3_stmt *statement;
int rc;

if ((rc = sqlite3_prepare_v2(db, [query UTF8String], -1, &statement, NULL)) != SQLITE_OK) {
    NSLog(@"%s (%ld)", sqlite3_errmsg(db), (long)rc);
} else {
    if ((rc = sqlite3_bind_text(statement, 1, [value UTF8String], -1, SQLITE_TRANSIENT)) != SQLITE_OK) {
        NSLog(@"%s (%ld)", sqlite3_errmsg(db), (long)rc);
    }
    while ((rc = sqlite3_step(statement)) == SQLITE_ROW) {
        const unsigned char *string = sqlite3_column_text(statement, 0);
        NSLog(@"%s", string);
    }
    if (rc != SQLITE_DONE) {
        NSLog(@"%s (%ld)", sqlite3_errmsg(db), (long)rc);
    }
    sqlite3_finalize(statement);
}

或者,如果使用FMDB:

FMResultSet *rs = [db executeQuery:query, value];
NSAssert(rs, @"%@", [db lastErrorMessage]);

while ([rs next]) {
    NSLog(@"%@", [rs resultDictionary]);
}
[rs close];

这很重要,可以防止因价值中出现'个字符而导致的问题(例如,如果您正在寻找“Bob's Bar and Grill”)。