我正在尝试使用单个命令删除多行:
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);
它工作得很好。知道我做错了什么吗?
您需要
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);
这应该适合您的目的。希望这有帮助!
也许你的数组构造不好。
你有这个:
String[] args = {"1143997,1144373,1144375,1144383,1144385,1144389"};
但我认为你想这样做:
String[] args = {"1143997","1144373","1144375","1144383","1144385","1144389"};
我认为您的数组只包含一个具有所有 ID 的元素,并且您需要一个包含 N 个元素的数组,每个 ID 一个。
看看这个答案。它可能会对你有所帮助。