2011-11-03 103 views
0

在我的应用程序中,我需要保存用户本地以及联机,但是当我想将用户插入到本地数据库(sqlite3)时出现问题。插入sqlite3数据库

用户可以选择一个字符,也是一个用户名,这是通过一个方法放入我的dbhandler对象,如图所示。

-(BOOL) registerUser : (NSString *) username : (int) character { 

sqlite3 *db; 

if(sqlite3_open([dbpath UTF8String], &db) == SQLITE_OK) 
{ 
    NSString *formatetStmt = [NSString stringWithFormat:@"INSERT INTO user VALUES (null, '%@', %d, 0, 1, 5, 1, 1, 1, 1, 1 ,1)", username, character]; 
    sqlite3_stmt *comstmt; 

    if(sqlite3_prepare_v2(db, [formatetStmt UTF8String], -1, &comstmt, NULL) == SQLITE_OK) 
    {      
     sqlite3_finalize(comstmt); 

     if(sqlite3_step(comstmt) == SQLITE_DONE) { 
      NSLog(@"SUCCESS"); 
      sqlite3_finalize(comstmt); 
      return YES; 
     } 
     else { 
      NSLog(@"NO SUCCES"); 
      return NO; 
     } 
     sqlite3_reset(comstmt);  
    } 
} 

NSAssert1(0, @"addMyObjectIntoDatabase: failed to prepare statement with err '%s'", sqlite3_errmsg(db)); 

NSLog(@"FAIL"); 
sqlite3_close(db); 
return NO; 

} 

} 

当我执行的代码,它说没有成功,但是我没有得到一个错误,并没有添加到数据库。

阿米在这里做错了什么?

+0

你得到一个错误sqlite3_step'的'结果,但你忽略它,因为你只检查'SQLITE_DONE' – Joe

+0

所以我把它添加到其他人,和现在出现错误='不是错误' 有什么建议吗? – MartinElvar

回答

1

SQLite是一个C库,它不直接与我一起工作,我推荐使用Objective-C包装器,例如FMDB甚至Core Data

以下是您的示例中的一些问题。

  1. 除非打开数据库或准备语句失败

  2. 你应该使用?防止SQL注入,而不是一个格式化字符串绑定的用户名和人物你永远不会关闭数据库。

  3. 您在使用前已完成声明。在关闭数据库之前完成语句时会进行最终确定。

  4. 你不知道错误代码,因为你不是从sqlite3_step这是一个int存储它。

  5. 您正从方法提前返回并且未关闭数据库。您应该设置成功标志,然后确保您的数据库实际打开,然后关闭它,然后在最后返回标志。


-(BOOL) registerUser : (NSString *) username : (int) character { 
    //If using the same database for more operations often you may want to just keep 
    //the db open in a centralized location while the app is running 
    sqlite3 *db; 

    if(sqlite3_open([dbpath UTF8String], &db) == SQLITE_OK) 
    { 
     //You should bind these values to prevent SQL Injection 
     NSString *formatetStmt = [NSString stringWithFormat:@"INSERT INTO user VALUES (null, '%@', %d, 0, 1, 5, 1, 1, 1, 1, 1 ,1)", username, character]; 
     sqlite3_stmt *comstmt; 

     if(sqlite3_prepare_v2(db, [formatetStmt UTF8String], -1, &comstmt, NULL) == SQLITE_OK) 
     {      
      // You are finalizing a statement before using it move this 
      // to after your done with the statement 
      sqlite3_finalize(comstmt); 
      //Try int status = sqlite3_step(comstmt) 
      if(sqlite3_step(comstmt) == SQLITE_DONE) { 
       NSLog(@"SUCCESS"); 
       sqlite3_finalize(comstmt); 
       return YES; 
      } 
      else { 
       NSLog(@"NO SUCCES"); 
       return NO; 
      } 
      sqlite3_reset(comstmt); //<- Never gets called because of return 
            // statement but you should finalize here 
     } 
    } 

    NSAssert1(0, @"addMyObjectIntoDatabase: failed to prepare statement with err '%s'", sqlite3_errmsg(db)); 

    NSLog(@"FAIL"); 
    sqlite3_close(db); // <-Never gets called unless statement fails to prepare 
    return NO; 

} 
+0

Thx一群乔,非常描述,正是我所需要的,我会研究这个:)。 – MartinElvar