我有一个包含以下列的表:

ID、播放器名称、播放器分数

随着一排排的

1,艾哈迈德,100分

2 、 Sara , 100

3,穆罕默德,100分.

和一个只包含名字和分数的回顾,我想在某个球员的分数栏中多加100分,如果他达到了某种条件,我这里的问题是我不知道如何获得球员的分数来增加100分.

我使用此方法插入分数:

fun insertScore(player: PlayersModel): Int {
    val db = writableDatabase
    val value = ContentValues()

    value.put(Col_Name, player.name)
    value.put(Col_Score, player.score + 100)

    val success = db.update(TABLE_NAME, value, "PlayerName='" + player.name + "'", null)
    db.close()

    return success
}

此方法用于在满足条件时添加点数:

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

此方法只添加100个点,然后停止.我想过获得球员得分,然后将其存储在一个变量中,但我不知道如何应用这一点,

推荐答案

如果要按分数中的某个数量(加或减)更改分数,则可以通过有效地使用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)}")
        }
    }
}

即代码:-

  1. 插入三个玩家
  2. 记录3名选手的得分
  3. 调整分数:-
    1. 第一个玩家加100,然后
    2. 在第二个玩家的基础上加50,然后
    3. 第三个玩家加-55(即减55)
  4. 记录分数(现已调整)

因此,日志(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
  • 即预期结果

Android相关问答推荐

懒惰列的滚动到项目不按预期工作'

使用RecycleView和Diffutils时从列表中删除项目时出现问题

为什么它显示我的空白屏幕?

如何用帆布在喷气背包中画一个圆环?

Jetpack Compose:根据盒子中的最大视图固定宽度和高度

需要 java 17 而不是 java 11:Android CI-CD GitHub Actions

将输出写入已发布的 Android 应用程序中的日志(log)文件?

参数化类RecyclerView.Adapter的原始使用

Android WebView 不会在滚动端加载新内容

请求访问小部件中的位置权限

appcompat 依赖从何而来?

如何在 android compose 中将具有渐变边缘的透明圆圈绘制到阴影覆盖层中?

如何在 Jetpack Compose 中的特定位置绘制图像

如何用jetpack compose实现垂直李克特量表

Jetpack Compose UI - 在 AlertDialog 中单击时按钮宽度会发生变化

如何在jetpack compose中通过lamda返回columnScope/RowScope

可组合的可见性不随状态变化而变化

Kotlin 调用带参数的函数 Any is xxx ||任何 yyy 都不起作用

在alert 对话框生成器中启动协程

CenterAlignedTopAppBar 滚动行为:未为参数状态传递值