0

SQLite データベースを使用する Android アプリがあります。1 つのアクティビティで、ユーザーは文字列と 2 つの値を追加できます。これは、次のコードで追加する必要があります。

    public void insertValue(SQLiteDatabase db, String type, String value1, String value2){
    String insertSQL = "INSERT INTO history (_id , calcType , value1 , value2) VALUES (" + null +", "+ type +", "+  value1 +", "+  value2 + ")";
    try {
        db.execSQL(insertSQL);
    }catch(SQLException e){
        Log.d("INSERT FAILURE", e.toString());
    }
}

「calcType」に手動で値を入力すると、次のエラーが発生します。「null」を入力すると、エラーは発生せず、SQL ステートメント全体が機能します。

    09-18 13:42:51.124: I/Database(1244): sqlite returned: error code = 1, msg = no such column: radius
    09-18 13:42:51.124: E/Database(1244): Failure 1 (no such column: radius) on 0x2a2900 when preparing 'INSERT INTO history (_id , calcType , value1 , value2) VALUES (null, radius, 34, 77)'.
    09-18 13:42:51.124: D/INSERT INTO FAILURE(1244):android.database.sqlite.SQLiteException: no such column: radius: INSERT INTO history (_id , calcType , value1 , value2) VALUES (null, radius, 34, 77)

データベースは次の文字列で作成されます:

    private static final String CREATE_TABLE_HISTORY = 
            "CREATE TABLE history(" + 
            "_id INTEGER PRIMARY KEY AUTOINCREMENT, " + 
            "calcType TEXT, " +
            "value1 TEXT NOT NULL, " + 
            "value2 TEXT NOT NULL" + ")";

Insert SQL Statemant または上記の表の何が問題なのかわかりません。

4

2 に答える 2

0

njkz2 は彼のコメントで正しいです。値をエスケープする必要があります。実行中のコードを取得するには、次のように変更します。

String insertSQL = (String)"INSERT INTO history (_id , calcType , value1 , value2) VALUES (" + null +", '"+ type +"', '"+  value1 +"', '"+  value2 + "')";

これは sql インジェクション攻撃の影響を受けやすく、値の 1 つに一重引用符 (') が含まれていると壊れることに注意してください。

于 2013-09-18T14:12:22.527 に答える