如果要按分数中的某个数量(加或减)更改分数,则可以通过有效地使用SQL:-
UPDATE the_table SET the_score_column = the_score_column + the_value_to_change_the_score_by WHERE the_name_column LIKE the_value_of_the_name
SQLiteDatabase update
方便的方法,因为它封装/包装值并没有促进这一点.因此,您需要执行相应的SQL.您可以使用SqliteDatabase execSQL
方法来执行此操作.
- 请注意,已经使用了binds值的版本,这减少/消除了SQL注入(基本上它将值括在单引号中,就像使用
ContentValues
一样).
因此,您可以使用类似以下内容的函数:-
fun increaseScore(player: PlayersModel) {
this.writableDatabase.execSQL("UPDATE $TABLE_NAME SET ${Col_Score} = ${Col_Score} + ? WHERE $Col_Name LIKE ? ", arrayOf(player.score.toString(),player.name))
}
要回答实际提出的问题(这会降低效率,因为它会检索现有分数来驱动更新),您可以使用如下内容:-
fun getPlayerScoreByName(playerName: String): Int {
var rv = 0
val csr = this.writableDatabase.query(TABLE_NAME, arrayOf(Col_Score),"$Col_Name=?", arrayOf(playerName),null,null,null,null)
val idx = csr.getColumnIndex(Col_Score)
if (csr.moveToFirst()) {
rv = csr.getInt(idx)
}
csr.close() /* SHOULD ALWAYS CLOSE A CURSOR WHEN DONE WITH IT */
return rv
}
- Note建议不要关闭数据库,除非它必须关闭(它将作为应用程序清理的一部分关闭).因此,代码不会关闭数据库.
Working example/demo(基于您的代码,即所做的一些假设)
为了插入玩家,以下函数与上述两个函数一起存在:-
fun insertPlayer(player: PlayersModel): Long {
val cv = ContentValues()
if (player.id != null) cv.put(Col_Id,player.id)
cv.put(Col_Name,player.name)
cv.put(Col_Score,player.score)
return this.writableDatabase.insert(TABLE_NAME,null,cv)
}
使用的活动代码(请注意,使用主线程是为了方便和简洁):-
const val p1 = "Ahmad"
const val p2 = "Sara"
const val p3 = "Mohammad"
class MainActivity : AppCompatActivity() {
lateinit var db: DBHelper
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
db = DBHelper.getInstance(this)
db.insertPlayer(PlayersModel(1, p1, 100))
db.insertPlayer(PlayersModel(2, p2, 10))
db.insertPlayer(PlayersModel(3, p3, 100))
logPlayerScores("STG1")
db.increaseScore(PlayersModel(-99 /* doesn't matter as id is ignored */,p1,100))
db.increaseScore(PlayersModel(2,p2,50))
db.increaseScore(PlayersModel(3,p3,-55))
logPlayerScores("STG2")
}
fun logPlayerScores(tagSuffix: String) {
val allPlayers = arrayOf(p1,p2,p3)
for (p in allPlayers) {
Log.d("DBINFO_$tagSuffix", "Score for $p= ${db.getPlayerScoreByName(p)}")
}
}
}
即代码:-
- 插入三个玩家
- 记录3名选手的得分
- 调整分数:-
- 第一个玩家加100,然后
- 在第二个玩家的基础上加50,然后
- 第三个玩家加-55(即减55)
- 记录分数(现已调整)
因此,日志(log)的输出为:-
2023-07-12 19:54:12.866 D/DBINFO_STG1: Score for Ahmad= 100
2023-07-12 19:54:12.867 D/DBINFO_STG1: Score for Sara= 10
2023-07-12 19:54:12.867 D/DBINFO_STG1: Score for Mohammad= 100
2023-07-12 19:54:12.869 D/DBINFO_STG2: Score for Ahmad= 200
2023-07-12 19:54:12.870 D/DBINFO_STG2: Score for Sara= 60
2023-07-12 19:54:12.870 D/DBINFO_STG2: Score for Mohammad= 45