Как удалить строки в SQLite с несколькими аргументами?

Я хочу удалить строки, которые удовлетворяют любому из нескольких условий.

Например, я передаю список идентификаторов, и я хочу удалить все строки с этими IDs (идентификаторы уникальны).

Это будет:

String[] ids = {"0", "1", "2", "3",...};
database.delete("rows" , "id=? OR id=? OR id=? OR id=? OR ..." , ids );

Есть ли способ сделать это компактным без нескольких OR?

6 ответов

Вы можете сделать это с помощью метода db.execSQL и SQL IN. Например:

String args = TextUtils.join(", ", ids);
db.execSQL(String.format("DELETE FROM rows WHERE ids IN (%s);", args));


То, что вы хотите использовать, - это предложение IN, что-то вроде (с 4 идентификаторами);

database.delete("rows", "id IN (?, ?, ?, ?)", ids );

По запросу это (один пример), как вы можете сделать это динамически;

database.delete("rows", 
 "id IN (" + new String(new char[ids.length-1]).replace("\0", "?,") + "?)", 
 ids);


Официальная документация Android сообщает здесь, что использование execSQL не является правильным способом удаления записей.

Я хотел бы предложить следующий простой метод. Используя предоставленный delete() api.

String[] idArray = new String[] {"1", "2", "3"};
String idsCSV = TextUtils.join(",", idArray);
SQLiteDatabase db = getWritableDatabase();
if (db != null) {
 db.delete("table_name", "id IN (" + idsCSV + ")", null);
 db.close();
}


Я сделал это, используя это:

Синтаксис утверждения Sqlite:

db.delete(TABLE_NAME,"COLUMN IN (?)", new String[]{commaSaparatedString})

Пример, основанный на вопросе:

String args = TextUtils.join(", ", ids);
db.delete("rows","id IN (?)", new String[]{args})


Вы можете использовать id IN (1, 2, 3, 4, ...) и непосредственно распечатать значения массива внутри скобок:

database.delete("rows", String.format("id IN (%s)", StringUtils.join(ids, ",")));

В качестве альтернативы я попытался бы использовать какой-то столбец flags для таких вещей (если есть что-то вроде того, что можно отмечать отдельные записи для удаления, я не знаю, как "ваш" список идентификаторов "построен",).


Вот пример, который строит строку "?,?,?,..." с StringBuilder. Если есть много параметров, простая конкатенация строк создаст много мусора, StringBuilder поможет с этим.

String[] ids = {"0", "1", "2", "3",...};
StringBuilder placeholders = new StringBuilder();
for (int i = 0; i < ids.length; i++) {
 if (i != 0)
 placeholders.append(", ");
 placeholders.append("?");
}
String where = "id IN (" + placeholders.toString() + ")";
db.delete("rows", where, args);

licensed under cc by-sa 3.0 with attribution.