使用whereClause中的IN sql语句删除多行

时间:2017-07-23 05:47:55

标签: android sqlite

我有一个执行多项选择的列表,然后删除使用此方法选择的项目。

 public Integer deleteDesc(ArrayList<String> rows) {
    String[] args = rows.toArray(new String[rows.size()]);
    Log.i("AMS", "Args: " + args);
    db = this.getWritableDatabase();
    return db.delete("DropdownList", "Description IN (?)", args);
}

其中参数ArrayList包含所选项。当我只选择一个项目但返回错误“绑定或列索引超出范围”时,我工作。

我很确定这是导致它的whereClause,因为我不确定如何正确使用“?”

2 个答案:

答案 0 :(得分:0)

我使用了这句话TextUtils.join(",", Collections.nCopies(args.length, "?"));

工作代码:

 public Integer deleteDesc(ArrayList<String> rows) {
    String[] args = rows.toArray(new String[rows.size()]);
    db = this.getWritableDatabase();
    return db.delete("DropdownList", "Description IN (" + TextUtils.join(",", Collections.nCopies(args.length, "?"))
            + ")", args);
}

答案 1 :(得分:0)

您可以使用?WHERE IN子句构建?使用准备好的声明为每个值占位符:

SQLiteDatabase db = this.getWritableDatabase();
StringBuilder sql = new StringBuilder("DELETE FROM yourTable WHERE Description IN (?");
for (int i=1; i < args.length; i++) {
    sql.append(",?");
}
sql.append(")");
SQLiteStatement stmt = db.compileStatement(sql.toString());
for (int i=0; i < args.length; ++i) {
    stmt.bindString(i+1, args[i]);
}
stmt.execute();

请注意,强烈建议您在此处使用预准备语句,因为您要删除数据。在此方法中允许SQL注入可能会产生不良副作用。