使用ID删除多行?

Nat*_*tix 3 sqlite android android-sqlite

如何通过Android SQLite数据库中的ID列表删除多行?

我以这种方式定义了一个通用的delete方法:

protected void deleteWhere(String whereClause, String[] whereArgs) {
    try {
        databaseHelper.getWritableDatabase().delete(
                getTableName(), whereClause, whereArgs);
    } finally {
        databaseHelper.close();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我尝试使用ID列表进行调用:

public void deleteAll(Iterable<T> entities) {
    Iterable<Long> ids = Iterables.transform(entities, getId);

    String whereClause = getIdColumn() + " IN (?)";
    String[] whereArgs = { TextUtils.join(",", ids) };
    deleteWhere(whereClause, whereArgs);
}
Run Code Online (Sandbox Code Playgroud)

例如,如果ID列表包含值[1、2、42],那么我认为生成的SQL应该是:

DELETE FROM tableName WHERE _id IN (1,2,42);
Run Code Online (Sandbox Code Playgroud)

但这似乎无法正常工作。如果该列表仅包含1个ID,则将其正确删除。但是,如果我提供多个值,则零行会受到影响。我究竟做错了什么?

CL.*_*CL. 5

当您将单个字符串指定为时whereArgs,单个字符串最终会出现在SQL命令中,就像您编写了此代码一样:

... WHERE _id IN ('1,2,42')
Run Code Online (Sandbox Code Playgroud)

这会将每个_id值与value 进行比较'1,2,42',这当然是行不通的。

如果使用三个参数标记并在whereArgs数组中提供三个字符串,则最终将得到三个字符串,如下所示:

... WHERE _id in ('1','2','42')
Run Code Online (Sandbox Code Playgroud)

仅当_id列具有整数亲和力时才有效,这对于声明为INTEGER PRIMARY KEY的列为true,但通常情况下不适用。

Android数据库API不允许查询参数具有字符串以外的任何类型。使用整数时,您应该直接将它们插入(如ianhanniballake的answer所示):

... WHERE _id IN ('1,2,42')
Run Code Online (Sandbox Code Playgroud)