如何通過Android SQLite數據庫中的ID列表刪除多行?使用ID刪除多行?
我已經以這種方式定義的一般刪除方法:
protected void deleteWhere(String whereClause, String[] whereArgs) {
try {
databaseHelper.getWritableDatabase().delete(
getTableName(), whereClause, whereArgs);
} finally {
databaseHelper.close();
}
}
現在我想用ID列表來調用它:如果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);
}
例如值[1,2,42],那麼我假設生成的SQL應該是:
DELETE FROM tableName WHERE _id IN (1,2,42);
但是,這似乎不工作co rrectly。如果列表僅包含1個ID,則它被正確刪除。但是,如果我提供多個值,則會影響零行。我究竟做錯了什麼?
哦,現在當我看到撇號被添加到值的方式時,這是有道理的。但是,是不是將值直接放入'whereClause'傾向於SQL注入?用適當數量的問號手動生成'whereClause'並將ID作爲String數組傳遞給'whereArgs'不是更好嗎? – Natix 2014-10-07 08:38:31
僅允許字符串作爲參數是Android數據庫API設計中的一個錯誤。無論如何,整數值對SQL注入是安全的;此問題僅出現在字符串中。 – 2014-10-07 08:40:36