5

配列内の ID に一致するすべての行をテーブルから削除したいと考えています。以下の2つの方法のいずれかでそれを行うことができます(両方とも機能しています)。どちらが良いかアドバイスお願いできますか?

方法 1:

public void deleteRec(String[] ids) { //ids is an array
        SQLiteDatabase db = this.getWritableDatabase();
        db.delete(TABLE_NAME, KEY_ID+" IN (" + new String(new char[ids.length-1]).replace("\0", "?,") + "?)", ids);
        db.close();
    }

方法 2:

public void deleteRec(String[] ids) { //ids is an array
        String allid = TextUtils.join(", ", ids);
        SQLiteDatabase db = this.getWritableDatabase();
        db.execSQL(String.format("DELETE FROM "+TABLE_NAME+" WHERE "+KEY_ID+" IN (%s);", allid));
       db.close();
    }
4

5 に答える 5

6

2番目の方法は忘れてください!

あなたidsはすべて数字からの文字列です(そうでなければSQLは失敗します)が、一般的な文字列データの場合、SQLステートメントにデータを渡すことは決して良い考えではありません. アプリケーションを SQL インジェクションに対して脆弱にする:

String.format("DELETE FROM t WHERE ID='%s', "1' AND 1=1 --")
// = "DELETE FROM t WHERE ID='1' AND 1=1 --'" => would delete all data!

SQL ステートメントが失敗する可能性があります。

String.format("DELETE FROM t WHERE v='%s', "It's me!")
// = "DELETE FROM t WHERE v='It's me!'" => syntactically incorrect (quote not escaped)!

編集:ids文字列配列として提供され、おそらく列KEY_IDを参照するためINT、方法1は次のように適応する必要があります:

db.delete(TABLE_NAME, "CAST("+KEY_ID+" AS TEXT) IN (" + new String(new char[ids.length-1]).replace("\0", "?,") + "?)", ids);
于 2013-11-08T10:47:42.643 に答える
0

このドキュメントを読んでください。潜在的なセキュリティリスクになる可能性があるため、INSERT、DELETE、UPDATE、または SELECT で execSQL を使用しないでください。それでも、パフォーマンスに関しては最初のものの方が優れていると思います。

于 2013-11-08T09:28:32.137 に答える
-7

これを試して

public void deleteRec(String[] ids) { //ids is an array
    SQLiteDatabase db = this.getWritableDatabase();
    for (int i = 0; i < ids.length; i++) {
        //Your code for delete
    }
    db.close();
}
于 2013-11-08T09:45:22.683 に答える