2009-06-27 29 views
1

データをテーブルに挿入するときに、sqlite3_stepがSQLITE_DONEを返します。しかし時にはテーブルに新しいデータがありません!たとえデータが追加された直後にチェックを行っても。奇妙なSQLiteの動作

は、ここに私のコードです:最後に言及したログ機能が呼び出されているんなぜ

sqlite3_stmt *addTranslationStmt2 = NULL; 

if(sqlite3_prepare_v2(database , "INSERT INTO translations(lang1_wordid, lang2_wordid) VALUES(?, ?)" , -1, & addTranslationStmt2, NULL) != SQLITE_OK) 
{ 
    NSLog(@"statement prepare error"); 
    addTranslationStmt2 = NULL; 
    return -1; 
} 

sqlite3_bind_int(addTranslationStmt2, 1, word_id); 
sqlite3_bind_int(addTranslationStmt2, 2, translation_id); 

if(sqlite3_step(addTranslationStmt2) != SQLITE_DONE) 
{ 
    NSLog(@"addTranslationStmt2 error: '%s'", sqlite3_errmsg(database)); 
    sqlite3_reset(addTranslationStmt2); 
    return -1; 
} 

sqlite3_reset(addTranslationStmt2); 

if (![self wordHasTranslation: word_id translation_id: translation_id]) 
    NSLog(@"And after all translation was not added even though sqlite3_step returns SQLITE_DONE!"); 

は、だから私は疑問に思って。これは、データを追加した後にテーブルにデータがないことを意味します。ときどきそれが追加され、時にはそうではありません。

どこに問題がありますか? ありがとうございます。

更新: これは、新しいデータベースが作成された場合にのみ発生することがわかりました。アプリケーションを再起動すると、正しい方法で動作します。しかし、新しいデータベースが作成されると、奇妙な動作が戻ってきます。

+0

wordHasTranslationに問題がある可能性はありますか? – outis

+0

いいえ、データが追加されたかどうかは私には分かりません。私は手動でデータベースをチェックしました - 新しいデータの兆候はありません。 コードの他の部分に他のデータを挿入しても、すべてが完璧に機能します。 –

答えて

2

Sqliteはデフォルトで自動コミットモードで動作しますが、以前の対話や設定によってリセットされたかどうかは分かりません。 INSERTの後ろに明示的にCOMMITを追加すると、それは役に立ちますか?

編集:おそらく、コメントからさらに情報が得られていないが、念のためにあなたが他の状況でコミットする必要があります、最も簡単な方法は次のとおりです。& C(もし通常の結果コードと

char* errmsg; 
int result = sqlite3_exec(database, "COMMIT", NULL, NULL, &errmsg); 

それが指しているエラーメッセージを使用した後にsqlite3_free(errmsg)にする必要があります)。

+0

明示的なCOMMITを追加する方法を教えてください。私はそれに精通していません。 –

+0

コミット後、次のエラーが表示されます。「コミットできません - トランザクションはアクティブではありません」 アイデアはありますか? .. –

+0

私はBEGIN/COMMITステートメントでコードをラップしようとしましたが、エラーは依然として続きます。 –