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

したがって、問題は、1 つの値のみに置き換えられるプレースホルダーを 1 つだけ配置し、引数の配列には 1 つの項目のみを含める必要があることです。?配列内の各アイテムに9x があれば、うまくいく可能性があります。

1 つのプレースホルダー - 1 つの値(同じ順序)として機能します。このコード スニペットを作成しました。見てみな。

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(']', ')')

配列を適切なSQLwhere句形式に変換します

于 2013-03-20T20:24:57.933 に答える