在我的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
查询应该是什么?
答案 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”)。