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

Lop*_*ela 22 database sqlite android

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

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

这将是:

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

有没有办法在没有多个的情况下紧凑OR

waq*_*lam 57

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

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

db.execSQL(String.format("DELETE FROM rows WHERE ids IN (%s);", args));
Run Code Online (Sandbox Code Playgroud)

  • 你也可以这样做,但在这种情况下,它会执行几次sql语句并对性能产生影响.相反,我建议您使用**IN**语句批量执行查询. (6认同)
  • 这很好而且简短,但它不使用参数绑定,这是一个安全问题.如果碰巧有一个像'1)或(1 = 1` ...的id怎么办? (2认同)
  • TextUtil.join以前不知道它!非常方便 (2认同)

Joa*_*son 17

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

database.delete("rows", "id IN (?, ?, ?, ?)", ids );
Run Code Online (Sandbox Code Playgroud)

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

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


小智 7

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();
}
Run Code Online (Sandbox Code Playgroud)