You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQLite数据库中获取指定玩家分数并累加100分

问题分析

你的问题核心是更新分数时没有读取数据库中玩家的实时最新分数,而是依赖调用方法时传入的固定score值。如果这个传入的score是初始的100,那每次调用都会把分数设为100+100=200,后续再调用还是基于这个旧值计算,自然只能实现一次加分效果。

解决方案

推荐两种可靠的实现方式,优先选择第一种(避免并发问题,效率更高):

方式一:直接在SQL语句中完成分数累加(最优)

不需要提前查询分数,直接通过SQL表达式让数据库自动基于当前值完成累加,同时用参数化查询避免SQL注入风险:

fun addScoreToPlayer(playerName: String): Int {
    val db = writableDatabase
    val value = ContentValues()
    // 用SQL表达式直接累加当前分数
    value.put(Col_Score, "PlayerScore + 100")

    val success = db.update(
        TABLE_NAME,
        value,
        "PlayerName = ?",
        arrayOf(playerName)
    )
    db.close()
    return success
}

对应修改rightAns方法,无需传入固定score参数:

private fun rightAns(button: Button): Boolean {
    val rightAns = intent.getStringExtra("clip")
    if (button.text.contentEquals(rightAns)) {
        val playerName = votingPlayer.text.toString()
        dbHelper.addScoreToPlayer(playerName)
        Log.e("score: ", "added 100")
        return true
    } else {
        return false
    }
}

方式二:先查询当前分数再累加

如果需要先获取分数做额外逻辑,可以先实现查询方法,再基于查询结果更新:

1. 新增查询当前分数的方法

fun getPlayerCurrentScore(playerName: String): Int {
    val db = readableDatabase
    var currentScore = 0
    val cursor = db.query(
        TABLE_NAME,
        arrayOf(Col_Score),
        "PlayerName = ?",
        arrayOf(playerName),
        null,
        null,
        null
    )
    if (cursor.moveToFirst()) {
        currentScore = cursor.getInt(cursor.getColumnIndexOrThrow(Col_Score))
    }
    cursor.close()
    db.close()
    return currentScore
}

2. 修改分数更新方法

fun insertScore(playerName: String): Int {
    val currentScore = getPlayerCurrentScore(playerName)
    val db = writableDatabase
    val value = ContentValues()
    value.put(Col_Score, currentScore + 100)

    val success = db.update(
        TABLE_NAME,
        value,
        "PlayerName = ?",
        arrayOf(playerName)
    )
    db.close()
    return success
}

3. 调整rightAns方法

private fun rightAns(button: Button): Boolean {
    val rightAns = intent.getStringExtra("clip")
    if (button.text.contentEquals(rightAns)) {
        val playerName = votingPlayer.text.toString()
        dbHelper.insertScore(playerName)
        Log.e("score: ", "added 100")
        return true
    } else {
        return false
    }
}
额外注意点
  • 分数更新后,记得调用RecyclerView适配器的notifyDataSetChanged()(或局部刷新方法),让界面同步显示最新分数。
  • 始终使用参数化查询(?占位符)代替字符串拼接,避免SQL注入和语法错误。

内容的提问来源于stack exchange,提问作者Haitham Shalabi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 07:52:53