sqlite3使用" WHERE列IN(?)"删除多行

时间:2016-01-28 22:40:32

标签: 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);

但是,如果我使用adb pull获取数据库文件,请从命令行运行sqlite3,然后键入

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

它运作得很好。知道我做错了吗?

2 个答案:

答案 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。它可能对你有帮助。