如何使用WHERE子句iOS 8从sqlite中检索数据

时间:2014-10-27 10:56:19

标签: objective-c sqlite ios8 xcode6 ios8.1

我对IOS编程很陌生,我在从数据库中检索一些数据时遇到了问题。它是我在我的应用程序上完成的简单登录页面。我需要检查用户名是否存在,并且似乎在以下行sqlite3_step(statement)== SQLITE_ROW失败,我似乎也在我编写我的SQL查询的行中发出警告"格式字符串"不使用数据参数。以下是我的代码

 sqlite3_stmt *statement;
    const char *dbpath = [_databasePath UTF8String];

    if(sqlite3_open(dbpath, &_db) == SQLITE_OK){

        NSString *query = [NSString stringWithFormat:@"SELECT USERNAME,PASSWORD FROM UserInfo WHERE USERNAME = \"%%@\"", self.txtUsername.text];
        const char *query_statement = [query UTF8String];

        if(sqlite3_prepare_v2(_db, query_statement, -1, &statement, NULL) == SQLITE_OK){
            if(sqlite3_step(statement) == SQLITE_ROW){

                NSString *username = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)];
                NSString *password = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)];

                if([username isEqualToString:self.txtUsername.text] && [password isEqualToString:self.txtPassword.text])
                {
                    [self showUIAlertWithMessage:@"Successfully logged in" andTitle:@"Message"];
                    [self shouldPerformSegueWithIdentifier:@"Login" sender:self];
                }
            }
            else{

                [self showUIAlertWithMessage:@"Username not found" andTitle:@"Message"];
            }
        }
        sqlite3_finalize(statement);
        sqlite3_close(_db);
    }

1 个答案:

答案 0 :(得分:1)

NSString的格式说明符是%@而不是%%@(实际上是NSObject派生的实现description方法的类。

使用%% 转义说明符,以便在您的情况下生成文字序列%@

注意:请考虑使用绑定变量,以避免可能的SQL注入攻击。

注2:鉴于数据库已经完成,该测试是多余的:

[username isEqualToString:self.txtUsername.text]