私は探し回っていましたが、解決策や実用的な例を見つけることができなかったので、ここに行きます。
ユーザーのリストを効果的に作成する、異なるフィールドを持つ5つの列を持つSQLiteデータベースをセットアップしました。自動インクリメントに設定されているROWIDを除いて、リストには同じ値が複数あります。
データベースに値が入力されると、ユーザーもプログラムもROWIDを認識しないため、他の4つのフィールドすべてが含まれている場合、ユーザーが1つの行を削除できるようにします。
私のコードは次のようになります:
Database
.delete(DATABASE_TABLE,
"KEY_DATE='date' AND KEY_GRADE='style2' AND KEY_STYLE='style' AND KEY_PUMPLEVEL='pumpLevel'",
null);
ただし、これによって値が削除されることはありません。このコマンドの構文が原因であるとほぼ確信しています。
複数のwhere句を使用してdeleteコマンドのwhere句をフォーマットするにはどうすればよいですか?
下からの解決策:
ourDatabase.delete(DATABASE_TABLE, "ROWID = (SELECT Max(ROWID) FROM "
+ DATABASE_TABLE + " WHERE " + "date=? AND grade=? AND "
+ "style=? AND pump_level=?)", new String[] { date, grade,
style, pumpLevel });
KEY_DATE
、KEY_GRADE
などはあなたですJava変数名実際の列名ではありません。コードを次のように変更してみてください:
.delete(DATABASE_TABLE,
KEY_DATE + "='date' AND " + KEY_GRADE + "='style2' AND " +
KEY_STYLE + "='style' AND " + KEY_PUMPLEVEL + "='pumpLevel'",
null);
また、私は'date'
、'style'
などはローカル変数に格納されます。whereArgs
パラメータを使用して、 SQLインジェクション攻撃 から自分を投影する必要があります。
.delete(DATABASE_TABLE,
KEY_DATE + "=? AND " + KEY_GRADE + "=? AND " +
KEY_STYLE + "=? AND " + KEY_PUMPLEVEL + "=?",
new String[] {date, grade, style, pumpLevel});
(どこ date = "date"
、grade = "style2"
など)
コメントから追加
最後の行を削除するには、次を使用します。
.delete(DATABASE_TABLE,
"ROWID = (SELECT Max(ROWID) FROM " + DATABASE_TABLE + ")",
null);
最後に一致した行を削除するには、次のことを試してください。
.delete(DATABASE_TABLE,
"ROWID = (SELECT Max(ROWID) FROM " + DATABASE_TABLE + " WHERE " +
"KEY_DATE='date' AND KEY_GRADE='style2' AND " +
"KEY_STYLE='style' AND KEY_PUMPLEVEL='pumpLevel')",
null);
ただし、データを保護するためのSQLインジェクション攻撃に関する2番目のメモを参照してください。
次を使用する必要があります。
Database.delete(DATABASE_TABLE,
"KEY_DATE=? AND KEY_GRADE = ? AND KEY_STYLE = ? AND KEY_PUMPLEVEL = ?",
new String[]{"date", "style2", "style", "pumpLevel"});
これにより、値のエスケープが簡単になります。