我试图用一个命令删除多行:
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);
它运作得很好。知道我做错了吗?
答案 0 :(得分:2)
n
个参数需要?
逗号分隔n
。尝试类似:
db.execSQL("DELETE FROM mytable WHERE recno IN (?,?,?,...)", args);
每个?
需要一个argument
,而args
应该是一个参数数组,而不是字符串。它应该像
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);
这应该适合您的目的。希望这有帮助!
答案 1 :(得分:1)
也许你的阵列构造不好。
你有这个:
String[] args = {"1143997,1144373,1144375,1144383,1144385,1144389"};
但我认为你想这样做:
String[] args = {"1143997","1144373","1144375","1144383","1144385","1144389"};
我认为你的数组只包含一个包含所有ID的元素,你需要一个包含N个元素的数组,每个ID一个。
看看this answer。它可能对你有帮助。