13

私は周りを検索してきましたが、解決策や実際の例を見つけることができなかったので、ここに行きます.

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

2 に答える 2

25

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

于 2012-08-28T15:33:35.057 に答える
8

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

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

これにより、値のエスケープが簡素化されます。

于 2012-08-28T15:39:45.140 に答える