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();
}
这不起作用请帮助我,我已经尝试了很多,但不明白错误的
答案 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});
在某些类中将列名存储为常量也是一种非常好的做法。你会避免类型问题(非常有名)。