SQLeT3 使用"WHERE column IN (?)"删除多行



我正在尝试使用单个命令删除多行:

String[] args = {"1143997,1144373,1144375,1144383,1144385,1144389"};
int n;
n = db.delete("mytable", "recno IN (?)", args);
Log.d(TAG, "Deleted " + n + " rows");

但它不起作用。也没有

db.execSQL("DELETE FROM mytable WHERE recno IN (?)", args);

但是如果我使用 adb pull 获取数据库文件,请从命令行运行 sqlite3,然后键入

DELETE FROM mytable WHERE recno in (1143997,1144373,1144375,1144383,1144385,1144389);

它工作得很好。知道我做错了什么吗?

您需要

n逗号分隔?才能n参数。尝试类似操作:

db.execSQL("DELETE FROM mytable WHERE recno IN (?,?,?,...)", args);

每个argument需要一个? args并且它应该是一个参数数组,而不是一个字符串。它应该像

String args[] = {arg1, arg2, arg3, ...};

您可以做的是根据参数数量以编程方式创建?。实现此功能。

/**
 * Function to create the argument "?,?,?,.." string
 *
 * @param len The length of array of arguments
 */
String makePlaceholders(int len) {
    StringBuilder sb = new StringBuilder(len * 2 - 1);
    sb.append("?");
    for (int i = 1; i < len; i++) {
        sb.append(",?");
    }
    return sb.toString();
}

然后,只需将 IN 子句查询设置为:

db.execSQL("DELETE FROM mytable WHERE recno IN (" + makePlaceholders(args.length()) + ")", args);

这应该适合您的目的。希望这有帮助!

也许你的数组构造不好。

你有这个:

String[] args = {"1143997,1144373,1144375,1144383,1144385,1144389"};

但我认为你想这样做:

String[] args = {"1143997","1144373","1144375","1144383","1144385","1144389"};

我认为您的数组只包含一个具有所有 ID 的元素,并且您需要一个包含 N 个元素的数组,每个 ID 一个。

看看这个答案。它可能会对你有所帮助。

最新更新