2013-08-23 112 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