如何在多个where args的SQLite中删除行?

时间:2013-01-16 11:59:49

标签: android database sqlite

我想删除满足任何多个条件的行。

例如,我传递了一个ID列表,我想删除所有带有IDs的行(ID是唯一的)。

这将是:

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

有没有办法在没有多个OR的情况下进行压缩?

6 个答案:

答案 0 :(得分:54)

您可以通过db.execSQL方法和SQL的 IN 关键字完成此操作。例如:

String args = TextUtils.join(", ", ids);

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

答案 1 :(得分:17)

您想要使用的是IN子句,类似于(有4个ID);

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

根据要求,这是(例如)你如何动态地做到这一点;

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

答案 2 :(得分:7)

Android官方文档告诉here使用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();
}

答案 3 :(得分:1)

您可以使用id IN (1, 2, 3, 4, ...)并直接在括号内打印数组值:

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

作为替代方案,我会尝试使用某种flags列来表示这类内容(如果有类似的东西可以标记单个条目进行删除;我不知道你的ID列表是怎样的“建“)。

答案 4 :(得分:1)

我用这个做了这个:

Sqlite语句语法:

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

基于问题的示例:

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

答案 5 :(得分:0)

这是一个构建"?,?,?,..." 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);