2016-01-28 38 views
0

我想用一條命令來刪除多行:SQLITE3使用刪除多行「WHERE列IN(?)」

String[] args = {"1143997,1144373,1144375,1144383,1144385,1144389"}; 
int n; 
n = db.delete("mytable", "recno IN (?)", args); 
Log.d(TAG, "Deleted " + n + " rows"); 

但它不工作。也沒有

db.execSQL("DELETE FROM mytable WHERE recno IN (?)", args); 

但如果我取得與adb pull數據庫文件,在命令行中運行sqlite3的,並鍵入

DELETE FROM mytable WHERE recno in (1143997,1144373,1144375,1144383,1144385,1144389); 

它工作得很好。任何想法我做錯了什麼?

回答

2

你需要n逗號爲n參數分離?。嘗試是這樣的:

db.execSQL("DELETE FROM mytable WHERE recno IN (?,?,?,...)", args); 

你需要一個?argumentargs應該是參數數組,而不是字符串。它應該像

String args[] = {arg1, arg2, arg3, ...}; 

你可以做的是以編程方式創建基於你的參數數量的?。實現這個功能。

/** 
* Function to create the argument "?,?,?,.." string 
* 
* @param len The length of array of arguments 
*/ 
String makePlaceholders(int len) { 
    StringBuilder sb = new StringBuilder(len * 2 - 1); 
    sb.append("?"); 
    for (int i = 1; i < len; i++) { 
     sb.append(",?"); 
    } 
    return sb.toString(); 
} 

然後,只需讓你的IN子句的查詢爲:

db.execSQL("DELETE FROM mytable WHERE recno IN (" + makePlaceholders(args.length()) + ")", args); 

這應該爲你的目的很好地工作。希望這可以幫助!

+0

好的,這比我指望的要複雜一些,因爲參數的數量可能會有所不同,這意味着我必須以編程方式構建我的「?,?,?...」字符串。讓我想一想...... –

1

也許你的數組構造不好。

你有這樣的:

String[] args = {"1143997,1144373,1144375,1144383,1144385,1144389"}; 

但我認爲你要做到這一點:

String[] args = {"1143997","1144373","1144375","1144383","1144385","1144389"}; 

我認爲你的數組僅包含一個元素與所有的ID,你需要用一個數組N個元素,每個ID一個。

看看this answer。它可能會幫助你。

+0

這個答案建議使用'String.format'來有效地生成'execSQL(「DELETE FROM mytable WHERE recno IN(1143997,1144373,1144375,1144383,1144385,1144389)」);'和否whereArgs對'execSQL()'的參數。我儘量避免因爲SQL注入攻擊而沒有whereArgs參數傳遞參數,但我想在這種情況下我相當確信這不會發生。 –