Android SQLite数据库错误

时间:2013-09-18 14:06:01

标签: android sqlite

我有一个使用SQLite数据库的Android应用程序。在一个Activity中,User可以添加一个String和两个Values。 这应该通过以下代码添加。

    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或上面列出的表格有什么问题。

2 个答案:

答案 0 :(得分:0)

njkz2在他的评论中是正确的。你需要逃避价值观。要获取运行的代码,请按以下方式进行更改:

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

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

答案 1 :(得分:0)

不需要强制转换,当你将值传递给TEXT字段时,你必须用单个qoutes包围

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