使用ID删除多行?

时间:2014-10-07 01:28:55

标签: android sqlite android-sqlite

如何通过Android SQLite数据库中的ID列表删除多行?

我已经以这种方式定义了一般删除方法:

protected void deleteWhere(String whereClause, String[] whereArgs) {
    try {
        databaseHelper.getWritableDatabase().delete(
                getTableName(), whereClause, whereArgs);
    } finally {
        databaseHelper.close();
    }
}

现在我试图用ID列表来调用它:

public void deleteAll(Iterable<T> entities) {
    Iterable<Long> ids = Iterables.transform(entities, getId);

    String whereClause = getIdColumn() + " IN (?)";
    String[] whereArgs = { TextUtils.join(",", ids) };
    deleteWhere(whereClause, whereArgs);
}

如果ID列表包含例如值[1,2,42],那么我假设结果SQL应该是:

DELETE FROM tableName WHERE _id IN (1,2,42);

但这似乎无法正常工作。如果列表仅包含1个ID,则会正确删除该ID。但是,如果我提供多个值,则会影响零行。我做错了什么?

3 个答案:

答案 0 :(得分:3)

由于whereArgs已完成转义,您无法将IN用于whereArgs语句(除非您为每个值单独?) - 而是,你必须在你的where语句中嵌入id:

String whereClause = getIdColumn() + " IN (" + TextUtils.join(",", ids) + ")";
deleteWhere(whereClause, null);

答案 1 :(得分:3)

当您将单个字符串作为whereArgs时,单个字符串最终会出现在SQL命令中,就好像您已经写过:

... WHERE _id IN ('1,2,42')

这会将每个_id值与值'1,2,42'进行比较,这当然不起作用。

如果使用三个参数标记并在whereArgs数组中给出三个字符串,最终会得到三个字符串,如下所示:

... WHERE _id in ('1','2','42')

仅当_id列具有整数affinity时才有效,对于声明为INTEGER PRIMARY KEY的列是正确的,但在一般情况下不是。

Android数据库API不允许查询参数包含任何类型的字符串。 使用整数时,您应该直接插入它们(如ianhanniballake's answer中所示):

String whereClause = getIdColumn() + " IN (" + TextUtils.join(",", ids) + ")";

答案 2 :(得分:0)

每个&#34;?&#34;只会绑定到一个值。因此,如果您的ID列表有三个值,那么您的whereClause将需要&#34; _id IN(?,?,?)&#34;