2014-11-08 155 views
0

我想用SQLite DB設計登錄和註冊表單。我做了三個字段的註冊表和兩個字段的登錄表。如何遍歷SQLite行?

Registration form: 
User Name: 
Password: 
RetypePassword: 

Login form: 
User Name: 
Password: 

如果任何用戶嘗試登錄的第一次,我們應該提供一個消息register.i.e,我們需要通過報名表進行迭代,並檢查登錄字段是否已經存在與否。

所以在這裏我錯過了邏輯(循環)遍歷註冊表的所有記錄。

- (void) loginBtn:(id)sender 
{ 
    const char *dbpath = [_databasePath UTF8String]; 
    sqlite3_stmt *statement; 

    NSMutableArray *arr=[[NSMutableArray alloc]init]; 

    if (sqlite3_open(dbpath, &_registerDB) == SQLITE_OK) 
    { 
      NSString *querySQL = [NSString stringWithFormat:@"SELECT * FROM registertable;"]; 

      const char *query_stmt = [querySQL UTF8String]; 

      if (sqlite3_prepare_v2(_registerDB,query_stmt, -1, &statement, NULL) == SQLITE_OK) 
      { 
        if (sqlite3_step(statement) == SQLITE_ROW) 
        { 
          NSString *regUserName = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]; 

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

          NSString *str=[NSString stringWithFormat:@"%@%@",regUserName,regPassword]; 

          [arr addObject:str]; 


          //************************LOOP ????????????? 

          for(int i=o;i<arr.count;i++){ 

           if([loginUserTxtFld.text isEqualToString:??????] && [loginPasswordTxtFld isEqualToString:??????] 
           { 
            NSLog(@"login successful"); 
           } 

           else{ 
            NSLog(@"You have not yet registered"); 

            } 

          } 


          _statusLabel.text = @"Match found"; 
        } else { 
          _status.text = @"Match not found"; 
          _regUserNameTxtFld.text = @""; 
          _regPwdTxtFld.text = @""; 
        } 
        sqlite3_finalize(statement); 
      } 
      sqlite3_close(_registerDB); 
    } 
} 

我需要改變以通過選定的行進行循環?

+0

爲什麼你需要迭代循環?只是SELECT * FROM registertable WHERE用戶名=%@「同時將你的userName字段定義爲索引 – 2014-11-08 15:54:58

+0

@RyanHeitner更正,使用'WHERE'子句爲你完成工作,但絕不要使用'stringWithFormat'來建立SQL, 'printf-style formatters。使用'?'佔位符並將值綁定到'sqlite3_bind_text'。或者使用類似[FMDB](https://github.com/ccgus/fmdb)的方式來處理這個麻煩。 – Rob 2014-11-08 16:02:55

回答

0

如果你想循環,更換

if (sqlite3_step(statement) == SQLITE_ROW) { 
    // this only retrieves one row 
} 

while (sqlite3_step(statement) == SQLITE_ROW) { 
    // this will be performed for each row 
} 

但是,甚至更好,你爲什麼不具備的SQLite做這項工作的嗎?

// NB: Do not use `stringWithFormat` to build this SQL, but rather use `?` 
//  placeholders and then call `sqlite3_bind_text` 

const char *query_stmt = "SELECT * FROM registertable WHERE username = ? AND password = ?"; 

if (sqlite3_prepare_v2(_registerDB, query_stmt, -1, &statement, NULL) != SQLITE_OK) { 
    NSLog(@"prepare failed: %s", sqlite3_errmsg(_registerDB)); 
} 

if (sqlite3_bind_text(statement, 1, [loginUserTxtFld.text UTF8String], -1, NULL) != SQLITE_OK) { 
    NSLog(@"bind userid failed: %s", sqlite3_errmsg(_registerDB)); 
} 

if (sqlite3_bind_text(statement, 2, [loginPasswordTxtFld.text UTF8String], -1, NULL) != SQLITE_OK) { 
    NSLog(@"bind password failed: %s", sqlite3_errmsg(_registerDB)); 
} 

int rc = sqlite3_step(statement); 
if (rc == SQLITE_ROW) { 
    // userid/password found 
} else if (rc == SQLITE_DONE) { 
    // userid/password not found, but no error 
} else { 
    NSLog(@"step failed: %s", sqlite3_errmsg(_registerDB)); 
} 

// continue with finalize, close, or whatever else 

很顯然,我不知道你的用戶名和密碼字段的名稱,所以相應地改變這個SQL,但希望這說明了想法。