代码之家  ›  专栏  ›  技术社区  ›  Parth Bhatt

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

  •  1
  • Parth Bhatt  · 技术社区  · 14 年前

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

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

    我想要什么:

    我想问一问

    从CategoryTable中选择类别,其中类别类似于“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 回复  |  直到 9 年前
        1
  •  2
  •   Joseph Tura    14 年前

    您需要在StringWithFormat中使用“%”。

        2
  •  2
  •   Dave DeLong    14 年前

    字符串格式说明符文档指出,如果需要 % 要出现在最终字符串中的文本字符,应使用 %% 格式字符串中。所以你应该用 '%@%%'

        3
  •  0
  •   Rob Md Fahim Faez Abir    9 年前

    如其他人所说,使用 %% 语法在 stringWithFormat 使文字百分比符号出现在搜索字符串中。但是,不要用SQL来实现这一点。只对值执行该操作。应该避免使用 带格式的字符串 将文本值直接插入到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”)。