25

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

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

这将是:

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

有没有什么办法可以在没有多个的情况下做到紧凑OR

4

7 回答 7

62

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

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

db.execSQL(String.format("DELETE FROM rows WHERE ids IN (%s);", args));
于 2013-01-16T12:04:20.687 回答
18

您要使用的是一个IN子句,例如(带有 4 个 ID);

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

根据要求,这是您如何动态执行此操作的(一个示例);

database.delete("rows", 
    "id IN (" + new String(new char[ids.length-1]).replace("\0", "?,") + "?)", 
    ids);
于 2013-01-16T12:05:26.720 回答
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();
}
于 2016-08-24T11:23:53.390 回答
2

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

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

作为替代方案,我会尝试对此类事情使用某种flags列(如果有类似能够标记单个条目以进行删除的功能;我不知道您的 ID 列表是如何“构建”的)。

于 2013-01-16T12:05:22.370 回答
1

我已经这样做了:

Sqlite 语句语法:

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

基于问题的示例:

String args = TextUtils.join(", ", ids);
db.delete("rows","id IN (?)", new String[]{args})
于 2016-06-08T10:03:14.303 回答
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);
于 2015-02-18T17:55:28.987 回答
0

这适用于我的 varchar ID。

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

这直接使用 args 构建 WHERE 字符串。相当于:

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

于 2022-02-21T08:21:53.293 回答