基于用户名引用将数据保存至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
相关产品推荐
相关产品推荐

