web-dev-qa-db-ja.com

複数の句を含むwhere句を含むSQLite行を削除します

私は探し回っていましたが、解決策や実用的な例を見つけることができなかったので、ここに行きます。

ユーザーのリストを効果的に作成する、異なるフィールドを持つ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 });
11
Gareth Bowen

KEY_DATEKEY_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番目のメモを参照してください。

21
Sam

次を使用する必要があります。

Database.delete(DATABASE_TABLE,
                "KEY_DATE=? AND KEY_GRADE = ? AND KEY_STYLE = ? AND KEY_PUMPLEVEL = ?",
                 new String[]{"date", "style2", "style", "pumpLevel"});

これにより、値のエスケープが簡単になります。

8