2016-09-14 3 views
0

私はSQLiteのDBに、指定したフィールドを保存するためのボタンを設定しようとしていますを取得します。私はテーブルを作成することができたが、ボタンのクリックでINSERT文がSQLITE_OK私を与えるのではなく、私にSQLITE_MISUSEエラーを与えています。私のコードに問題が何であるかを知ることができません。なぜこれが起こっているのかを知る手がかりがあれば教えてください。は、SQLiteの誤用エラー

- (IBAction)SignUp:(id)sender { 
    sqlite3_stmt *statement; 
    const char *dbPath = [_databasePath UTF8String]; 

    if(sqlite3_open(dbPath, &_DB) == SQLITE_OK) { 
     NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO users(username, email, password) values(\"%@\", \"%@\", \"%@\")", _Username.text, _Email.text, _Password1.text]; 

     const char *insert_statement = [insertSQL UTF8String]; 
     sqlite3_prepare_v2(_DB, insert_statement, -1, &statement, NULL); 


     if(sqlite3_step(statement) == SQLITE_DONE) { 
      //below creates a popup success message upon adding user to the db 
      UIAlertController * alert = [UIAlertController 
             alertControllerWithTitle:@"Congrats!" 
             message:@"You are now a member" 
             preferredStyle:UIAlertControllerStyleAlert]; 

      UIAlertAction* okButton = [UIAlertAction 
             actionWithTitle:@"Ok" 
             style:UIAlertActionStyleDefault 
             handler:^(UIAlertAction * action) { 
             // 
             }]; 

      [alert addAction:okButton]; 
      [self presentViewController:alert animated:YES completion:nil]; 

      //returns the text fields back to original empty state 
      _Username.text = @""; 
      _Email.text = @""; 
      _Password1.text = @""; 
      _Password2.text = @""; 
     } 
     else { 
      //some other error 
      UIAlertController * alert= [UIAlertController 
              alertControllerWithTitle:@"Some" 
              message:@"Other Error" 
              preferredStyle:UIAlertControllerStyleAlert]; 
      UIAlertAction* ok = [UIAlertAction 
           actionWithTitle:@"OK" 
           style:UIAlertActionStyleDefault 
           handler:^(UIAlertAction * action) 
           { 
            [alert dismissViewControllerAnimated:YES completion:nil]; 
           }]; 
      [alert addAction:ok]; 
      [self presentViewController:alert animated:YES completion:nil]; 
     } 
     sqlite3_close(_DB); 
    } 
} 

答えて

1

投稿されたコードにいくつかの問題があります。

  1. あなたはプリペアドステートメントを確定することはありません。
  2. あなたはsqlite3_prepare_v2への呼び出しにチェックすべてのエラーをしません。
  3. stringWithFormat:でクエリを構築することはありません。適切なsqlite3_bind_xxx関数を使用して、値をクエリに正しくバインドします。

これらの問題を解決する例については、https://stackoverflow.com/a/39001417/1226963を参照してください。

+0

素晴らしい、ありがとうございました! – dgelinas21

+0

うれしい私は助けることができます。投票したり、有益な回答を受け入れることを忘れないでください。 – rmaddy