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

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

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

Это было бы:

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

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

7 ответов

Решение

Вы можете сделать это через db.execSQL метод и ключевое слово IN 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() апи.

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();
}

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

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

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

Я сделал это с помощью этого:

Синтаксис оператора Sqlite:

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

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

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

Вот пример, который строит строку-заполнитель "?,?,?, ..." с помощью 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);

Эта работа для моего идентификатора varchar.

      public Integer deleteObjects(List<Object> objects){
    if (objects.size()<1) return 0;
    SQLiteDatabase db = getWritableDatabase();
    StringBuilder strb= new StringBuilder();
    for(int i = 0; i<objects.size();i++){
        strb.append("'");
        strb.append(objects.get(i).getId().toString());
        strb.append("'");
        // last element without comma
        if (i<objects.size()-1) strb.append(","); 
    }
    int rows = db.delete("table_name","id IN (" + strb + ")",null);
    db.close();
    return rows;
}

Эта строка WHERE создается напрямую с аргументами. Эквивалентно:

       db.delete(TABLE_NAME,"id IN ('id0-maddog','id1-foo','id2-bar')",null); 

Другие вопросы по тегам