複数の条件を満たす行を削除したい。
たとえば、ID のリストを渡し、これらを含むすべての行を削除したいとしますIDs
(ID は一意です)。
これは:
String[] ids = {"0", "1", "2", "3",...};
database.delete("rows" , "id=? OR id=? OR id=? OR id=? OR ..." , ids );
複数なしでコンパクトにする方法はありますOR
か?
db.execSQL
メソッドと SQL のINキーワードを使用して実行できます。例えば:
String args = TextUtils.join(", ", ids);
db.execSQL(String.format("DELETE FROM rows WHERE ids IN (%s);", args));
使用したいのは、IN
(4 つの ID を持つ); のような句です。
database.delete("rows", "id IN (?, ?, ?, ?)", ids );
要求に応じて、これは (一例として) 動的に行う方法です。
database.delete("rows",
"id IN (" + new String(new char[ids.length-1]).replace("\0", "?,") + "?)",
ids);
Android の公式ドキュメントでは、 execSQLの使用はレコードを削除する適切な方法ではないことが示されています。
次の簡単な方法を提案したいと思います。提供されdelete()
た API を使用します。
String[] idArray = new String[] {"1", "2", "3"};
String idsCSV = TextUtils.join(",", idArray);
SQLiteDatabase db = getWritableDatabase();
if (db != null) {
db.delete("table_name", "id IN (" + idsCSV + ")", null);
db.close();
}
id IN (1, 2, 3, 4, ...)
括弧内に配列値を使用して直接出力できます。
database.delete("rows", String.format("id IN (%s)", StringUtils.join(ids, ",")));
別の方法として、そのようなことのためにある種のflags
列を使用しようとします(削除のために単一のエントリにフラグを付けることができるようなものがある場合; IDリストがどのように「構築」されているかわかりません)。
私はこれを使用してこれを行いました:
Sqlite ステートメントの構文:
db.delete(TABLE_NAME,"COLUMN IN (?)", new String[]{commaSaparatedString})
質問に基づく例:
String args = TextUtils.join(", ", ids);
db.delete("rows","id IN (?)", new String[]{args})