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

