Android sqlite3使用“删除多行”;其中(?)中的列;

Android sqlite3使用“删除多行”;其中(?)中的列;,android,sqlite,Android,Sqlite,我试图用一个命令删除多行: 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); 但

我试图用一个命令删除多行:

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);
每个
参数需要一个
参数应该是参数数组,而不是字符串。应该是

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();
}

这对你的目的来说应该很有效。希望这有帮助

可能您的数组构造得不好

你有这个:

String[] args = {"1143997,1144373,1144375,1144383,1144385,1144389"};
但我认为你想这样做:

String[] args = {"1143997","1144373","1144375","1144383","1144385","1144389"};
我认为您的数组只包含一个包含所有ID的元素,您需要一个包含N个元素的数组,每个ID一个元素


看。这可能会对您有所帮助。

该答案建议使用
String.format
有效地生成
execSQL(“从recno所在的mytable中删除(114399711443731144375114438311443851144389)”
和无wherergs参数到
execSQL()
。由于SQL注入攻击,我尽量避免在没有wherergs参数的情况下传递参数,但我想在这种情况下,我很有信心这不会发生。好的,这比我所期望的要复杂一些,因为参数的数量可能会有所不同,这意味着我必须以编程方式构建我的“,?,?…”字符串。让我想想。。。
String[] args = {"1143997","1144373","1144375","1144383","1144385","1144389"};