2013-08-23 127 views
0

我想在視圖控制器中編程一個用戶名/密碼日誌,沒有錯誤,在我的應用程序沒有警告,但它總是輸出「找不到匹配」,即使當我選擇一個用戶名已存在於我的數據庫..我真的很感激,如果ü可以幫助 這是代碼:爲什麼沒有找到SQLite記錄?

[super viewDidLoad]; 

NSString *docsDir; 
NSArray *dirPaths; 
// Get the documents directory 
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
docsDir = dirPaths [0]; 
_databasePath = [[NSString alloc]initWithString:[docsDir stringByAppendingPathComponent:@"bank.db"]]; 
NSFileManager *filemgr = [NSFileManager defaultManager]; 
if ([filemgr fileExistsAtPath:_databasePath] == NO) 
{ 
    const char *dbpath = [_databasePath UTF8String]; 
    if (sqlite3_open(dbpath, &_bankDb) == SQLITE_OK) 
    { 
     char *errMsg; 
     const char *sql_stmt = " CREATE TABLE IF NOT EXISTS USER (USERNAME TEXT PRIMARY KEY, PASSWORD TEXT)"; 
     if (sqlite3_exec(_bankDb, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) 
     { 
      _status.text= @"failed to create table"; 
     } 
     sqlite3_close(_bankDb); 
    } else { 
     [email protected]"failed to open/create database"; 
    } 

} 


- (IBAction)findContact:(id)sender { 

    const char *dbpath = [_databasePath UTF8String]; 
    sqlite3_stmt *statement; 
    if (sqlite3_open(dbpath, &_bankDb) == SQLITE_OK) 
    { 
     NSString *querySQL = [NSString stringWithFormat:@"SELECT USERNAME, PASSWORD FROM USER WHERE USERNAME=\"%@\"", _usernameTextField.text]; 
     const char *query_stmt = [querySQL UTF8String]; 
     if (sqlite3_prepare_v2(_bankDb, query_stmt, -1, &statement, NULL) == SQLITE_OK) 
     { 
      if (sqlite3_step(statement) == SQLITE_ROW) 
      { 
       NSString *usernameField=[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]; 
       _usernameTextField.text=usernameField; 
       NSString *passwordField = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 1) ]; 
       _passwordTextField.text=passwordField; 
       [email protected]"match found"; 

      } else { 
       [email protected]"match not found"; 
      } 
      sqlite3_finalize(statement); 
     } 

     sqlite3_close(_bankDb); 
    } 

} 
+0

是C++嗎?請將該語言作爲問題的標記。 – Renan

+0

這是客觀的C – Shams7353

+2

數據庫中的純文本密碼? – Joe

回答

4

你應該做以下事情,

  1. 看看sqlite3_errmsg值,如果任何查詢失敗(如sqlite3_prepare_v2不返回SQLITE_OKsqlite3_step確實不退還SQLITE3_DONESQLITE3_ROW);

  2. 不要使用stringWithFormat與查詢,而是使用?佔位符和綁定值與sqlite3_bind_text

這樣:

if (sqlite3_open(dbpath, &_bankDb) == SQLITE_OK) 
{ 
    const char *query_stmt = "SELECT USERNAME, PASSWORD FROM USER WHERE USERNAME=?"; 
    if (sqlite3_prepare_v2(_bankDb, query_stmt, -1, &statement, NULL) != SQLITE_OK) 
     NSAssert(0, @"prepare failed: %s", sqlite3_errmsg(_bankDb)); 

    if (sqlite3_bind_text(statement, 1, [_usernameTextField.text UTF8String], -1, NULL) != SQLITE_OK) 
     NSAssert(0, @"bind failed: %s", sqlite3_errmsg(_bankDb)); 

    int rc = sqlite3_step(statement); 
    if (rc == SQLITE_ROW) 
    { 
     NSString *usernameField=[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]; 
     _usernameTextField.text=usernameField; 
     NSString *passwordField = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 1) ]; 
     _passwordTextField.text=passwordField; 
     _status.tex[email protected]"match found"; 
    } else if (rc == SQLITE_DONE) { 
     [email protected]"match not found"; 
    } else { 
     NSAssert(0, @"step failed: %s", sqlite3_errmsg(_bankDb)); 
    } 
    sqlite3_finalize(statement); 

    sqlite3_close(_bankDb); 
} 

如果你還在用match not found失敗,你應該:

  • 檢查_usernameTextField.text的內容,確保您的IBOutlet連接正確。

  • 查看數據庫的內容並確保找到具有所需userid的記錄;您沒有向我們顯示添加用戶標識的位置,所以我們很難診斷爲什麼找不到用戶標識。

我必須承認,總體邏輯(只是尋找匹配記錄該用戶ID和填充密碼字段,如果你找到了用戶ID)看起來十分可疑(你不應該肯定存儲明文密碼,你不應該返回一個簡單的用戶ID提供的密碼),但我只專注於爲什麼你看到match not found錯誤消息的戰術問題。

+0

首先,謝謝羅布。我非常感謝 第二,我已經完成了你告訴我要做的每一件事,但仍然沒有找到匹配,我再次檢查了每一件事情,然後我甚至發佈了這個問題,仍然是相同的..我不知道還有什麼做。 加上你說的關於「密碼」的東西,我對此很陌生,我實際上不知道如何以正確的方式做到這一點,請你或其他人幫助我,給我一個有用的教程?我真的很感激它 – Shams7353

+0

@ Shams7353 np。關於「未找到匹配」,也許您可​​以更新向我們顯示插入用戶ID記錄的代碼的問題。 (你向我們展示了表是如何創建的,以及你如何讀取用戶標識,但從未在創建用戶標識的地方顯示。)你是否從設備/模擬器中查看數據庫(例如,在Mac sqlite工具中打開它並確認你正在尋找的用戶記錄在那裏?如果你在模擬器上運行應用程序,你可以在〜/庫/應用程序支持/ iPhone模擬器/ ... – Rob

+0

(你可能不得不從終端命令行取消隱藏Library'chflags nohidden〜/ Library',如果你還沒有。) – Rob