2011-06-20 21 views
0

レコードをデータベースに挿入しようとしていますが、そのたびにレコードをデータベースに2回挿入します。 私は私の挿入を行うには、次のクエリを使用しています:INSERT OR REPLACEはSQLITE内のレコードを更新しません

-(void) insert { 
     NSString *sqlQuery = [NSString stringWithFormat:@"INSERT OR REPLACE INTO test(ID,KEY) VALUES ('%d','%@');", test.id, test.key]; 
     const char *insert_sql = [sqlQuery UTF8String]; 
     sqlite3_exec(db, insert_sql, NULL, NULL, NULL); 
} 

それは常に私がこのクエリを実行するたびに、レコードを複製入ります。データがすでに存在するかどうかを確認してから、donotを挿入するだけです。

答えて

3

stringWithFormat:を使用してSQL文字列を初期化していますが、渡す文字列は書式文字列ではありません。 ?のパラメータは、sqliteパーサーのみが認識します。

あなたは

// Assuming id is an int and key is a string 
NSString *sqlQuery = [NSString stringWithFormat:@"INSERT OR REPLACE INTO test(ID,KEY) VALUES (%d,%@);", test.id, test.key]; 

それとも、ワイルドカードにパラメータをバインドするsqliteの準備/バインド機能を呼び出す必要がでSQL文字列を置換することによって、いずれかのこの問題を解決することができます。これについては、preparebindのマニュアルを参照してください。

これは、SQLインジェクションを防ぐので、2番目の方法をお勧めします。

+0

こんにちはFrenetisch。入力ミスを申し訳ありません。そして、私はbindがSQLインジェクションを避けるのに役立つだろうと思う。私はその方向を見るかもしれない。ありがとう。 – lifemoveson

1

IDはテーブルの主キーですか、そうでなければインデックスされていますか?置き換えを行うには、一意である必要があります。

+0

はい。その固有の識別子。 – lifemoveson

+0

それがそうであれば、重複したレコードを取得することはできません。気付いていない方法でIDが異なっていたり、スキーマが間違っていたりします。 –

+0

IDは実際には36文字の長さのUUIDで、常にユニークです。この問題は、アプリケーションを実行してXMLファイルを解析し、このメソッドを呼び出して新しいデータを挿入および置換または更新する場合にのみ発生します。常にデータのカウントをインクリメントします。 – lifemoveson