我想删除满足任何多个条件的行。
例如,我传递了一个ID列表,我想删除所有带有IDs
的行(ID是唯一的)。
这将是:
String[] ids = {"0", "1", "2", "3",...};
database.delete("rows" , "id=? OR id=? OR id=? OR id=? OR ..." , ids );
有没有办法在没有多个OR
的情况下进行压缩?
答案 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);