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

基于用户名引用将数据保存至Firebase的实现问题

解决用用户名保存Firebase分数的问题

嘿,这个问题其实很好解决!既然你已经通过UID在Users节点存储了用户的姓名和用户名,那核心就是通过当前登录用户的UID反向查询到对应的用户名,之后就能用它作为键来保存分数了。我给你分步骤拆解,再附上代码示例:

步骤1:获取当前登录用户的UID

首先你得拿到当前已登录用户的UID,这是连接Users节点和用户数据的关键:

FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
if (currentUser == null) {
    // 处理用户未登录的情况,比如跳转登录页
    return;
}
String userUid = currentUser.getUid();

步骤2:从Users节点读取用户名

拿到UID后,就可以去实时数据库的Users节点里找到对应用户的用户名:

DatabaseReference userRef = FirebaseDatabase.getInstance().getReference("Users").child(userUid);

// 用一次性监听器读取数据(避免持续监听浪费资源)
userRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        if (snapshot.exists()) {
            // 假设你的用户数据里存储用户名的字段叫"username"
            String username = snapshot.child("username").getValue(String.class);
            
            if (username != null) {
                // 拿到用户名后,就可以执行保存分数的逻辑了
                saveScoreWithUsername(username, userFinalScore);
            } else {
                // 处理用户名不存在的异常情况
                Log.e("ScoreSave", "用户数据中未找到用户名");
            }
        } else {
            Log.e("ScoreSave", "未找到对应用户的数据库记录");
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        // 处理数据库读取失败的情况
        Log.e("ScoreSave", "读取用户数据失败:" + error.getMessage());
    }
});

步骤3:用用户名保存分数

接下来就是写一个单独的方法,用拿到的用户名作为节点键来保存分数:

private void saveScoreWithUsername(String username, int finalScore) {
    DatabaseReference scoreRef = FirebaseDatabase.getInstance().getReference("Scores").child(username);
    
    scoreRef.setValue(finalScore)
        .addOnSuccessListener(aVoid -> {
            // 分数保存成功的回调,比如提示用户
            Toast.makeText(getContext(), "分数已成功保存!", Toast.LENGTH_SHORT).show();
        })
        .addOnFailureListener(e -> {
            // 保存失败的回调,处理错误
            Toast.makeText(getContext(), "分数保存失败:" + e.getMessage(), Toast.LENGTH_SHORT).show();
        });
}

优化小技巧

如果你的应用经常需要用到用户名,没必要每次都查数据库——可以在用户登录成功后,把用户名存在SharedPreferences里,之后直接读取即可,能提升性能:

// 登录成功后保存用户名到SharedPreferences
SharedPreferences prefs = getSharedPreferences("AppPrefs", MODE_PRIVATE);
prefs.edit().putString("current_username", username).apply();

// 之后需要用时直接读取
String savedUsername = prefs.getString("current_username", null);
if (savedUsername != null) {
    saveScoreWithUsername(savedUsername, userFinalScore);
}

⚠️ 注意:一定要确保用户名的唯一性!如果注册时没有校验用户名是否重复,后续不同用户用相同用户名会导致分数被覆盖,所以注册环节要加一步用户名唯一性检查哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:33:06