gpt4 book ai didi

android - 使用 ID 删除多行?

转载 作者:太空宇宙 更新时间:2023-11-03 12:18:16 27 4
gpt4 key购买 nike

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

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

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

现在我尝试用 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);
}

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

DELETE FROM tableName WHERE _id IN (1,2,42);

但这似乎不能正常工作。如果列表只包含 1 个 ID,则它被正确删除。但是,如果我提供多个值,则零行会受到影响。我做错了什么?

最佳答案

当您将单个字符串作为 whereArgs 时,单个字符串将在 SQL 命令中结束,就像您这样写一样:

... WHERE _id IN ('1,2,42')

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

如果您使用三个参数标记并在 whereArgs 数组中给出三个字符串,您最终会得到三个字符串,如下所示:

... WHERE _id in ('1','2','42')

这仅在 _id 列具有整数 affinity 时有效,这对于声明为 INTEGER PRIMARY KEY 的列是正确的,但在一般情况下并非如此。

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

String whereClause = getIdColumn() + " IN (" + TextUtils.join(",", ids) + ")";

关于android - 使用 ID 删除多行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26227289/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com