2011-06-20 106 views
0

我試圖插入到數據庫中的記錄,每當我這樣做,它在數據庫中插入記錄兩次不更新記錄。 我使用下面的查詢做我插入:插入或更換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); 
} 

它總是進入重複的記錄,每當我運行此查詢。有沒有辦法來檢查數據是否已經存在,然後不插入只是更新。

回答

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

替換SQL字符串或者解決這個問題,或者您需要調用sqlite的準備/綁定功能參數綁定到通配符。爲此,請參閱preparebind文檔。

我建議的第二種方式,因爲這樣可以防止SQL注入。

+0

Hello Frenetisch。對不起,錯字。是的,我猜測綁定將幫助我避免SQL注入。我可以看看這個方向。謝謝。 – lifemoveson

1

是ID爲表的主鍵,或以其它方式索引?它需要是唯一的替代發生。

+0

是。它是唯一標識符。 – lifemoveson

+0

如果是這樣,那麼就不可能獲得重複的記錄......要麼這些ID不同於你沒有注意到的方式,或者這個模式是錯誤的。 –

+0

ID實際上是36個字符的UUID,並且其始終是唯一的。只有當我運行應用程序並解析我的XML文件時,我纔會調用此方法來插入和替換或更新新數據。但它總是增加數據的數量。 – lifemoveson