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,则将其正确删除。但是,如果我提供多个值,则零行会受到影响。我究竟做错了什么?
当您将单个字符串指定为时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)
| 归档时间: |
|
| 查看次数: |
1266 次 |
| 最近记录: |