从特定行的特定列中获取特定值?

时间:2018-04-08 18:34:01

标签: android sqlite

我的表名为“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();
}

有人可以帮我吗?感谢名单

1 个答案:

答案 0 :(得分:1)

选项1 - 根据SQL

中的算术计算递增

您可以将此基于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;
}
  • 请注意,如果无法执行更新,则会返回false。
  • 使用sqlEscapeString,将逃脱播放器名称,我相信可以提供一些防止SQL注入的保护。

选项2 - 检索当前值,计算新值,使用新的更新: -

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;
}
  • 请注意,如果无法执行更新,则会返回false。