2011-11-03 8 views
0

Dans mon application, je dois enregistrer l'utilisateur local et en ligne, mais le problème survient lorsque je veux insérer l'utilisateur dans sa base de données locale (sqlite3).Insertion dans la base de données sqlite3

L'utilisateur peut sélectionner un caractère, également un nom d'utilisateur, ceci est soumis à une méthode sur mon objet dbhandler, comme indiqué.

-(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; 

} 

} 

Lorsque le code I exécuté, il dit sans succès, mais je ne reçois pas d'une erreur, et rien est ajouté à la db.

Ami fait quelque chose de mal ici?

+0

Vous obtenez une erreur à la suite de 'sqlite3_step' mais vous ignorez parce que vous vérifiez que pour' SQLITE_DONE' – Joe

+0

Alors je l'ai ajouté à l'autre, et je suis maintenant obtenir une erreur = 'pas une erreur' Des suggestions? – MartinElvar

Répondre

1

SQLite est une bibliothèque C qui n'est pas très souhaitable de travailler directement avec et je recommande d'utiliser un wrapper Objective-C pour cela comme FMDB ou même Core Data.

Voici quelques problèmes avec votre exemple.

  1. Vous ne fermez la base de données à moins d'ouvrir la base de données ou la préparation de l'instruction échoue

  2. Vous devez lier le nom d'utilisateur et le caractère en utilisant ? pour empêcher l'injection SQL plutôt que d'une chaîne formatée.

  3. Vous finalisez l'instruction avant de l'utiliser. La finalisation se produit lorsque vous avez terminé avec l'instruction avant de fermer la base de données.

  4. Vous ne connaissez pas le code d'erreur car vous ne le stockez pas à partir de sqlite3_step qui est un int. Vous revenez prématurément de la méthode et vous ne fermez pas la base de données. Vous devriez probablement définir un indicateur de succès, puis assurez-vous que votre base de données est réellement ouverte, puis fermez-la et renvoyez le drapeau à la fin.


-(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 un groupe Joe, très décrivant, juste ce dont j'avais besoin, je vais regarder dans ce :). – MartinElvar

Questions connexes