这个android语句显示sqlite错误

时间:2013-11-20 20:53:37

标签: android

int pos=spinner1.getSelectedItemPosition();
            String temp=(String)spinner1.getItemAtPosition(pos);
            db = openOrCreateDatabase("MY_App_Data", MODE_PRIVATE, null);
            ContentValues cvUpdate=new ContentValues();
            cvUpdate.put("msg",msg.getText().toString());
            try
            {

            //public int update (String table, ContentValues values, String whereClause, String[] whereArgs) 

            db.update("MY_TABLE",cvUpdate,"column_one="+temp+, null);

            readdata();//method call
            }
            catch (Exception e) 
            {
                Toast.makeText(this, "No row found!!!", Toast.LENGTH_SHORT).show();
            }

这不起作用请帮助我,我已经尝试了很多,但不明白错误的

2 个答案:

答案 0 :(得分:0)

如果temp是字符串,则必须添加'

db.update("MY_TABLE", cvUpdate, "column_one='" +temp +"'", null);

如果temp是一个数字,你至少应该省略+

db.update("MY_TABLE", cvUpdate, "column_one=" +temp, null);

p.s。最佳选择是使用预准备语句:

SQLiteStatement st = db.compileStatement(
                    "UPDATE MY_TABLE SET msg = ? WHERE column_one = ?"); 

st.bindString(1, msg.getText().toString()); 
st.bindString(2, temp); 

st.execute();

这允许绑定正确的类型,从而有助于避免不必要的类型转换。如果您有许多更新,请考虑打开和关闭交易(请参阅beginTransaction()endTransaction())。这对运行时性能有很大影响。

答案 1 :(得分:0)

这是你的问题:

b.update("MY_TABLE",cvUpdate,"column_one="+temp+, null);

您正在为列语句直接添加值(及其字符串),但不正确。由于您要直接为列添加值,因此必须将它们包装成单引号 - 否则SQLite会将其解释为下一列(不存在)。你还有一个额外的加号。

所以它应该是:

b.update("MY_TABLE", cvUpdate, "column_one = '" + temp + "'", null);

建议:

通常建议使用参数化语句,因为原始语句不安全且不易读取。通常建议采用这种做法。所以它可以像这样重写:

b.update("MY_TABLE", cvUpdate, "column_one = ?", new String[] {temp});

在某些类中将列名存储为常量也是一种非常好的做法。你会避免类型问题(非常有名)。