我的表名为“highscore”
表中有: id(int), 名称(字符串), win(int), 绘制(INT), 损失(INT)。
我想做一个查询,我可以从行获得特定值win,只有整数..我怎么能这样做?我想处理sql注入。
我有一个更新胜利的方法,但我需要获得胜利,将值增加1然后更新。我的更新方法是这样,它可以工作:
public void updateWin(String playerName, int win) {
SQLiteDatabase db = this.getReadableDatabase();
ContentValues values = new ContentValues();
values.put(Constants.KEY_WIN, win);
db.update(Constants.TABLE_NAME, values, Constants.KEY_PLAYER_NAME + "= ?", new String[]{playerName});
db.close();
}
有人可以帮我吗?感谢名单
答案 0 :(得分:1)
您可以将此基于SQL(假设表格为 mytable001 ,且播放器名称为 FRED ): -
UPDATE mytable001 SET win = win +1 WHERE playername = 'FRED';
这将取消查询播放器名称以获取当前获胜次数的需要,因为它直接递增该值。
但是,这不能通过便捷更新方法或使用execSQL的rawQuery来完成。
因此可以使用以下内容: -
public boolean incrementWin(String playerName) {
SQLiteDatabase db = this.getWritableDatabase();
String esc_playername = DatabaseUtils.sqlEscapeString(playerName);
String qrysql = "UPDATE " +
Constants.TABLE_NAME +
" SET " +
Constants.KEY_WIN + " = " +
Constants.KEY_WIN + " + 1" +
" WHERE " +
Constants.KEY_PLAYER_NAME + "=" + esc_playername;
db.execSQL(qrysql);
long changes = DatabaseUtils.longForQuery(db,"SELECT changes()",null);
db.close();
return changes > 0;
}
sqlEscapeString
,将逃脱播放器名称,我相信可以提供一些防止SQL注入的保护。public boolean incWin(String playername) {
SQLiteDatabase db = this.getWritableDatabase();
String whereclause = Constants.KEY_PLAYER_NAME + "=?";
String[] wherargs = new String[]{playername};
int win = -1; // default to not update
Cursor csr = db.query(
Constants.TABLE_NAME,
null,
whereclause,
wherargs,
null,
null,
null
);
if (csr.moveToFirst()) {
win = csr.getInt(csr.getColumnIndex(Constants.KEY_WIN)) + 1;
}
csr.close();
if (win < 1) {
db.close();
return false;
}
ContentValues cv = new ContentValues();
cv.put(Constants.KEY_WIN,win);
if (db.update(Constants.TABLE_NAME,cv,whereclause,wherargs) > 0) {
db.close();
return true;
}
db.close();
return false;
}