2013-11-09 45 views
0

我正在使用SQLite3在我的iPhone应用程序中做登录表单。用户名和密码已成功上传到数据库,但是当我检查数据的存在时,我得到一个错误。这是我使用的代码时,试图赶上数据:检查数据库中是否存在用户名 - SQLite3&objective-c

- (IBAction)loginTapped:(id)sender 
{ 
if (sqlite3_open([self.filePath UTF8String], &db) == SQLITE_OK) 
{ 
    NSString *sql = [NSString stringWithFormat:@"SELECT username, password FROM register WHERE username = '%@'",[self.usernameLogin text]]; 
    sqlite3_stmt *statement; 
    if (sqlite3_prepare_v2(db, sql.UTF8String, -1, &statement, NULL) == SQLITE_OK) 
    { 
     if (sqlite3_step(statement) == SQLITE_ROW) 
     { 
      char *f1 = (char *)sqlite3_column_text(statement, 1); 
      NSString *user = [[NSString alloc] initWithUTF8String:f1]; 
      char *f2 = (char *)sqlite3_column_text(statement, 2); 
      NSString *pass = [[NSString alloc] initWithUTF8String:f2]; 
      NSLog(@"User : %@, Password : %@",user, pass); 
     } 
    } 

    sqlite3_finalize(statement); 
} 
sqlite3_close(db); 
} 

当这个方法被调用我得到这个错误:

2013-11-09 22:34:24.702 SQLiteTest[1385:60b] *** Terminating app due to uncaught exception  'NSInvalidArgumentException', reason: '*** -[NSPlaceholderString initWithUTF8String:]: NULL cString' 
*** First throw call stack: 
(0x2f5eef53 0x399c76af 0x2f5eee95 0x2ff24f87 0xf7789 0x31d94f3f 0x31d94edf 0x31d94eb9 0x31d80b3f 0x31d9492f 0x31d94601 0x31d8f68d 0x31d64a25 0x31d63221 0x2f5ba18b 0x2f5b965b 0x2f5b7e4f 0x2f522ce7 0x2f522acb 0x34243283 0x31dc4a41 0xf7d25 0x39ecfab7) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
(lldb) 

什么可能是错误的?

回答

0

列索引从零开始:

 char *f1 = (char *)sqlite3_column_text(statement, 0); 
     char *f2 = (char *)sqlite3_column_text(statement, 1); 
+0

不应该是问题,在索引0我有另一列... –

+0

这些都是*语句*的列索引,而不是*表*。该查询返回恰好两列。 –

0

添加检查该值从数据库来不是创建一个字符串出来之前空。像:

NSString *user; 
NSString *pass; 

char *f1 = (char *)sqlite3_column_text(statement, 1); 
if(f1 != NULL) 
    user = [[NSString alloc] initWithUTF8String:f1]; 

char *f2 = (char *)sqlite3_column_text(statement, 2); 
if(f2!= NULL) 
    pass = [[NSString alloc] initWithUTF8String:f2]; 

NSLog(@"User : %@, Password : %@",user, pass); 
+0

如果我输入一个用户名,或者只是输入任何内容,那么'if(sqlite3_step(statement)== SQLITE_OK){}'根本不会被执行。但是,如果我将'usernameLogin'保留为空,那么if-statement被执行,然后我发现'f1'和'f2'不是空,并且记录了消息,但是没有占位符的文本 –

相关问题