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

Android游戏Firebase登录节点下存储用户累计分数问题

嘿,作为Android新手能搞定游戏+登录功能已经超棒啦!针对你要给每个登录用户保存累计分数的需求,我来一步步给你捋清楚怎么实现~

核心思路:用用户UID做唯一标识

每个通过Firebase Auth登录的用户,都会获得一个独一无二的UID(用户ID)。我们就用这个UID作为Realtime Database里的节点名称,这样每个用户的分数数据就会完全隔离,不会和其他用户的混淆。

第一步:先搞定基础配置和安全规则

首先得确保你的项目已经集成了Firebase Auth(支持邮箱、谷歌等登录方式)和Realtime Database。另外一定要设置安全规则,不然任何人都能随便修改你的数据!

去Firebase控制台的Realtime Database页面,把规则改成这样:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}

这个规则的意思是:只有登录用户自己,才能读写自己UID节点下的数据,完美保证数据安全。

第二步:游戏结束后,计算并保存累计分数

当游戏结束拿到当前分数后,我们需要做这几件事:获取当前用户UID → 读取历史累计分 → 计算新分数 → 存回Firebase。

给你个Kotlin代码示例(Java逻辑完全一致,只是语法不同):

import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.database.FirebaseDatabase
import com.google.firebase.database.ValueEventListener

// 假设游戏结束后,你拿到了当前回合的分数currentScore
val currentScore = 100

// 获取当前登录的用户
val currentUser = FirebaseAuth.getInstance().currentUser
currentUser?.let { user ->
    val uid = user.uid
    val database = FirebaseDatabase.getInstance()
    // 指向该用户的累计分数节点
    val userScoreRef = database.getReference("users/$uid/totalScore")

    // 读取历史累计分数
    userScoreRef.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {
            // 如果是用户第一次玩,snapshot.value会是null,默认给0
            val oldTotalScore = snapshot.getValue(Int::class.java) ?: 0
            val newTotalScore = oldTotalScore + currentScore

            // 把新的累计分数存回Firebase
            userScoreRef.setValue(newTotalScore)
                .addOnSuccessListener {
                    // 保存成功后的操作,比如给用户个提示
                }
                .addOnFailureListener { e ->
                    // 保存失败的处理,比如打印错误日志
                    e.printStackTrace()
                }
        }

        override fun onCancelled(error: DatabaseError) {
            // 读取失败的处理
            error.toException().printStackTrace()
        }
    })
} ?: run {
    // 如果用户没登录,这里要做处理,比如跳转到登录页面
}
第三步:下次用户登录后,读取累计分数

用户登录成功后,你可以读取他的累计分数,用来展示或者后续游戏计算:

val currentUser = FirebaseAuth.getInstance().currentUser
currentUser?.let { user ->
    val uid = user.uid
    val database = FirebaseDatabase.getInstance()
    val userScoreRef = database.getReference("users/$uid/totalScore")

    userScoreRef.addListenerForSingleValueEvent(object : ValueEventListener {
        override fun onDataChange(snapshot: DataSnapshot) {
            val totalScore = snapshot.getValue(Int::class.java) ?: 0
            // 拿到分数后,比如显示在UI上:textView_totalScore.text = "累计分数:$totalScore"
        }

        override fun onCancelled(error: DatabaseError) {
            error.toException().printStackTrace()
        }
    })
}
最终的Firebase数据结构

完成后,你的Realtime Database里的JSON结构会是这样的:

{
  "users": {
    "abc123xyz": { // 这里是用户的UID
      "totalScore": 350
    },
    "def456uvw": {
      "totalScore": 120
    }
  }
}
小提醒
  • 如果以后要加其他用户数据(比如用户名、最近游戏时间),直接在$uid节点下加新字段就行,比如"username": "小明"
  • 一定要在进入游戏前检查用户是否登录,避免出现空指针或者数据读写失败的情况

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:55:19