如何通过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。但是,如果我提供多个值,则会影响零行。我做错了什么?
答案 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;