2

嗨,我可以这样做吗??,

int[] ids=new int[]{1,2,3,4,6,7,8,9,10};

db.execSQL(DELETE FROM TABLE_NAME WHERE id NOT IN ?,ids);

基本上我想删除所有与我的 ids 数组不匹配的行。

4

2 回答 2

3

所以你的问题是你只放置了一个占位符,它将只替换为一个值,并且 args 数组应该只有一项。如果?数组中的每个项目都有 9x,它应该可以工作。

它用作一个占位符 - 一个值(相同的顺序)。我为你写了这段代码。看看这个。

int[] ids = new int[] {1,2,3,4,6,7,8,9,10};
StringBuilder query = new StringBuilder();
query.append("delete from table where column_id not in (");
for (int i = 0; i < ids.length; i++) {
    query.append("?");
    if (i < ids.length - 1) {
        query.append(",");
    }
}
query.append(")");
db.execSQL(query.toString(), ids);

现在它应该可以工作了。?动态创建的查询中的字符也称为占位,每个占位符将被String[]相同顺序的值替换。

每当您使用数据库时,我都非常推荐使用占位符。这种方法更清洁、更安全、更美观。

API 11+ 更新

public int delete() {
    int[] ids = new int[] {1,2,3,4,6,7,8,9,10};
    String[] args = new String[ids.length];
    StringBuilder query = new StringBuilder();
    query.append("delete from table where column_id not in (");
    SQLiteStatement stmt = null;
    for (int i = 0; i < ids.length; i++) {
        args[i] = String.valueOf(ids[i]);
        query.append("?");
        if (i < ids.length - 1) {
            query.append(",");
        }
    }
    query.append(")");
    stmt = db.compileStatement(query.toString());
    stmt.bindAllArgsAsStrings(args);
    return stmt.executeUpdateDelete();
}
于 2013-03-20T18:55:39.577 回答
1

您可以使用:

java.util.Arrays.toString(ids).replace('[', '(').replace(']', ')')

将数组转换为合适的 SQL where 子句格式

于 2013-03-20T20:24:57.933 回答