SQLite-запрос для поиска похожих слов с помощью предложения SQLite «like» - PullRequest
1 голос
/ 17 ноября 2010

В моем приложении для 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 ]

2 голосов
/ 17 ноября 2010

Вам нужно использовать %% в stringWithFormat.

2 голосов
/ 17 ноября 2010

Документ спецификатора формата строки говорит, что если вы хотите, чтобы буквальный символ % появился в последней строке, вы должны использовать %% в строке формата.Так что вы должны использовать '%@%%'

0 голосов
/ 14 ноября 2015

Как уже говорили другие, используйте синтаксис %% в 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];

Это важно для предотвращения проблем, связанных с появлением символов ' внутри значения (например, еслиВы ищете "Бар и гриль Боба").

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...