Как удалить несколько строк по списку идентификаторов в базе данных Android SQLite?Удалить несколько строк с помощью идентификаторов?
Я определил общий метод удаления таким образом:
protected void deleteWhere(String whereClause, String[] whereArgs) {
try {
databaseHelper.getWritableDatabase().delete(
getTableName(), whereClause, whereArgs);
} finally {
databaseHelper.close();
}
}
И теперь я пытаюсь вызвать его со списком идентификаторов:
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);
Но это не похоже на работу сотрудничества rrectly. Если список содержит только 1 идентификатор, он будет удален. Однако, если я предоставляю несколько значений, это влияет на нулевые строки. Что я делаю не так?
О, теперь, когда я вижу способ добавления апострофов к значениям, это имеет смысл. Однако, не помещает ли значения непосредственно в 'whereClause', склонный к SQL-инъекции? Не лучше ли вручную генерировать 'whereClause' с соответствующим количеством вопросительных знаков, а затем передавать идентификаторы в массив' whereArgs' как String? – Natix
Разрешение только строк как параметров является ошибкой в дизайне API баз данных Android. В любом случае, целочисленные значения безопасны для SQL-инъекций; эта проблема возникает только со строками. –