2012-07-17 75 views
2

我已經搜遍了所有問題,但是還沒有找到答案。我最接近的是Passing an array to sqlite WHERE IN clause via FMDB?。但是,答案似乎並不奏效。該命令不會引發任何錯誤,但它不會執行預期的操作(例如,DELETE)。 這裏就是我想要做的事:SQL WHERE IN子句不起作用 - FMDB - 傳遞逗號分隔字符串

[myDB executeUpdateWithFormat:@"DELETE FROM table WHERE row_id IN (%@)",rowIdsToBeDeleted]; 

rowIdsToBeDeleted是一個逗號分隔包含的rowid爲NSNumber的對象,例如的NSString

1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012 

我甚至嘗試過使用executeUpdate,但沒有運氣。 請問你們能幫忙嗎?

回答

-2

如果這個方法就像是NSPredicate語法什麼,只是去掉括號(他們爲您處理(並通過一個集合,而不是字符串)中:

NSArray *ids = [rowIdsToBeDeleted componentsSeparatedByString:@","]; 
[myDB executeUpdateWithFormat:@"DELETE FROM table WHERE row_id IN %@",ids]; 

編輯

而且,通常你傳遞一個實際的集合對象(不是字符串)......上述編輯,以反映

+0

我發送一個包含CS NSNumber對象的NSString(它不像NSPredicate /發送NSNumbers,因爲ints在FMDB上不起作用)。然而,我試過你的解決方案,它給出了以下錯誤(FMDB錯誤代碼1,語法錯誤):'near「?」:語法錯誤「 – Subzero 2012-07-17 17:17:40

+0

謝謝,我也會嘗試。然而,其他人發佈了另外一個解決方案,但是他猜測他刪除了這個解決方案。感謝他,下面的工作就像一個魅力: – Subzero 2012-07-17 17:27:53

+0

不得不downvote這個,因爲它根本不會工作。 – 2013-08-15 16:15:10

4

你可以做簡單:

[myDB executeUpdate:[NSString stringWithFormat:@"DELETE FROM table WHERE row_id IN (%@)",rowIdsToBeDeleted]]; 

儘管人們可能以其他方式從方法名推斷,該executeUpdateWithFormat方法做執行傳統的printf樣式的格式。在幕後,它實際上是遍歷格式化字符串,用?佔位符替換printf樣式的字符串,然後嘗試合適的sqlite3_bind_xxx函數將值綁定到這些佔位符。

executeUpdateWithFormat的這種實現引入了各種微妙的問題。 (因此,在未來的FMDB版本中很可能會被棄用)。在這種情況下,問題是sqlite3_bind_xxx無法將逗號分隔的字符串作爲綁定到單個?佔位符的值數組綁定。

一般應避免使用stringWithFormat(或雨燕字符串插值)來構建要傳遞給FMDB或SQLite的SQL語句,因爲如果處理不適當,你可以接觸到SQL注入攻擊和/或如果您無法正常逃脫失敗字符串值。但是,在這個例子中,如果您想測試某個數字值是否在一組數值內,則該規則是例外情況,您可以使用stringWithFormat,如上所示。

+0

executeUpdateWithFormat實際上與將格式化的字符串傳遞給executeUpdate不同。不幸。嘗試了以前的變體,它沒有工作,因爲它試圖將所有東西都轉換爲SQL綁定。 – Tony 2012-11-10 02:32:23

+0

簡單的NSString stringWithFormat確實有效。我可以證實這一點。 – Tony 2012-11-10 22:14:21

+0

executeUpdateWithFormat與executeUpdate不同的原因是變量替換是由SQLite完成的,它會清理輸入,所以包含逗號的字符串不會被視爲多個值,而是一個帶有逗號的大字符串值。 – charles 2015-06-12 16:10:26