我有一个使用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或上面列出的表格有什么问题。
答案 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 + "')";