2012-03-14 20 views
0

sqliteとiPhoneを初めて使用していて、データベースにレコードを追加する際に問題があります。私はこの問題を解決するためにオンラインでできるものを使ってきましたが、私は骨が折れています。iPhoneのsqliteデータベースにデータを挿入する - 動作しない

私はSQLiteのデータベースにレコードを追加しようとするコードのこの部分を使用しています:

-(void)insertData{ 

    sqlite3 *database; 
    sqlite3_stmt *statement; 
    NSString *databasePath = [[NSBundle mainBundle] pathForResource:@"ProductDatabase" ofType:@"sql"]; 
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
    { 
     //nutrional values 
     float caloriesFloat = [caloriesTextField.text floatValue]; 
     float saturatesFloat = [saturatesTextField.text floatValue]; 
     float fatFloat = [fatTextField.text floatValue]; 
     float fibreFloat = [fibreTextField.text floatValue]; 
     float sugarFloat = [sugarTextField.text floatValue]; 
     float saltFloat = [saltTextField.text floatValue]; 

     NSString *insertSQL = [NSString stringWithFormat: @"INSERT INTO products (name,category,calories, saturates,fat,fibre,sugar,salt) VALUES ('%@',' %@','%.02f','%.02f','%.02f','%.02f','%.02f','%.02f',);",nameTextField.text, categoryLabel.text, caloriesFloat, saturatesFloat, fatFloat, fibreFloat, sugarFloat, saltFloat]; 
     const char *insert_stmt = [insertSQL UTF8String]; 
     if(sqlite3_prepare_v2(database, insert_stmt, -1, &statement, nil)== SQLITE_OK) 
     { 
      sqlite3_bind_text(statement, 1, [nameTextField.text UTF8String], -1, NULL); 
      sqlite3_bind_text(statement, 2, [categoryLabel.text UTF8String], -1, NULL); 
      sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", caloriesFloat] UTF8String], -1, NULL); 
      sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", saturatesFloat] UTF8String], -1, NULL); 
      sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", fatFloat] UTF8String], -1, NULL); 
      sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", fibreFloat] UTF8String], -1, NULL); 
      sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", sugarFloat] UTF8String], -1, NULL); 
      sqlite3_bind_text(statement, 3, [[NSString stringWithFormat:@"%f", saltFloat] UTF8String], -1, NULL); 
     } 

     if(sqlite3_step(statement)==SQLITE_DONE) 
     { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Product Added" message:@"" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];  
      [alert show]; 

     } 
     else 
     { 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Product Not Added" message:@"An error has occured" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
      [alert show]; 
      alert=nil; 
     } 
     // Release the compiled statement from memory 
     sqlite3_finalize(statement);  
     sqlite3_close(database); 
    } 
} 

アラートビュー常に表示される「製品が追加されていない」、誰もがなぜ私のレコードISN」を説明することができます追加されますか?

おかげで、

ジャック

+0

問題を明確にするために 'sqlite3_errmsg(database) 'を使用できますか? – FluffulousChimp

+0

http://stackoverflow.com/questions/2785211/sqlite3-database-doesnt-actually-insert-data-iphone – MishieMoo

答えて

2

そのあなたが直接資源folder.itにdatabaseにデータを書き込んでいるので、あなたがdocument directorydatabaseをコピーする必要がある最初の書き込み可能ではありません。

NSString *databasePath=[[NSBundle mainBundle]pathForResource:@"ProductDatabase" ofType:@"sql"]; 

は、上記の行

NSError *err=nil; 
    NSFileManager *fm=[NSFileManager defaultManager]; 

    NSArray *arrPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, -1); 
    NSString *path=[arrPaths objectAtIndex:0]; 
    NSString path2= [path stringByAppendingPathComponent:@"ProductDatabase.sql"]; 


    if(![fm fileExistsAtPath:path2]) 
    { 

     bool success=[fm copyItemAtPath:databasePath toPath:path2 error:&err]; 
     if(success) 
      NSLog(@"file copied successfully"); 
     else 
      NSLog(@"file not copied"); 

    } 

後の下に書かれたコードを追加し、コードからバインド・ステートメントを削除し、

if(sqlite3_prepare_v2(database, insert_stmt, -1, &statement, nil)== SQLITE_OK) 
        { 
            

        if(sqlite3_step(statement)==SQLITE_DONE) 
        { 
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Product Added" message:@"" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];     
            [alert show]; 

        } 
        else 
        { 
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Product Not Added" message:@"An error has occured" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];   
            [alert show]; 
            alert=nil; 
        }   
} 
1

まずに変更し、ドキュメントへのあなたのDBをコピーします。メインバンドルでは変更できません。

第2に、sqlite3データベースでSQL文を作成して実行する方法が2つあります。

1つの方法は、文字列操作(文字列と数値を追加するためのus%@、%dなど)を使用してSQL文字列全体を作成し、dbをsqlで実行することです。

もう1つの方法は、SQL文字列の各変数に疑問符(?)を付け、これらの変数をそれぞれにバインドすることです。 sqlite3_bindステートメントを使用する

各アプローチには長所と短所がありますが、必要なものを選択できます。 あなたのコードにはどちらも間違っています

また、ステートメントにバインドする場合は、すべての数値を文字列に変換する必要はありません。あなたはsqlite3_bind_int、sqlite3_bind_doubleなどを使用することができます。

関連する問題