如何在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
相关产品推荐
相关产品推荐

