0

我有一个使用 SQLite 数据库的 android 应用程序。在一个活动中,用户可以添加一个字符串和两个值。这应该通过以下代码添加。

    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" + ")";

我不知道插入 SQL 语句或上面列出的表有什么问题。

4

2 回答 2

0

njkz2 在他的评论中是正确的。您需要转义这些值。要获取您正在运行的代码,请将其更改如下:

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

请注意,这很容易受到 sql 注入攻击,并且如果其中一个值包含单引号 ('),则会中断。

于 2013-09-18T14:12:22.527 回答
0

不需要强制转换,而且当您将值传递给 TEXT 字段时,您必须用单个 qoutes 括起来

String insertSQL = "INSERT INTO history (_id , calcType , value1 , value2) VALUES (" + null +", '"+ type +"', '"+  value1 +"', '"+  value2 + "')";
于 2013-09-18T14:17:06.913 回答