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

如何从Firebase正确获取当前登录用户的相关信息?

问题根源

你两次代码的问题分别如下:

  • 第一版代码错误调用了身份提供商数据接口:user.getProviderData()返回的是当前登录渠道(你用的是邮箱密码登录)的认证信息,不是你手动存在Firebase实时数据库里的自定义用户表数据。邮箱密码登录的提供商默认不会存储你自定义的name字段,所以才会出现getDisplayName()返回null、providerId返回password、uid返回登录邮箱的结果。
  • 第二版代码读数据库的逻辑有两个错误:一是你已经把数据库引用定位到了/Users/[当前用户uid]这个对应单个用户的节点,不需要再遍历dataSnapshot.getChildren();二是你取字段时调用了toString()方法,这个方法会直接打印DataSnapshot对象的描述信息,不会返回字段存储的实际值,再加上你多遍历了一层子节点找name,自然拿到的value是null。
修正代码

直接从当前用户节点的快照上读取name字段的字符串值即可,不需要额外遍历:

FirebaseAuth userAuth = FirebaseAuth.getInstance();
FirebaseUser currentUser = userAuth.getCurrentUser();
if (currentUser != null){
    String uid = currentUser.getUid();
    DatabaseReference userRef = FirebaseDatabase.getInstance().getReference("Users").child(uid);
    userRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                // 取出name字段的字符串值
                String userName = dataSnapshot.child("name").getValue(String.class);
                helloUser.setText(userName);
                Log.d(TAG, "UserGetResult:success " + userName);
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            // 打印错误信息方便排查权限、网络类异常
            Log.w(TAG, "loadUserInfo failed", error.toException());
        }
    });
}
补充说明

如果你不想每次都读实时数据库拿用户名,也可以在用户注册完成后,通过UserProfileChangeRequest给Firebase Auth模块下的当前用户直接设置displayName,之后就可以直接调用currentUser.getDisplayName()拿到用户名。注意这个属性是存在Firebase Auth服务下的,和你存在实时数据库Users表里的name字段是独立存储的两份数据,不会自动同步。

内容的提问来源于stack exchange,提问作者T.Kopa

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 20:06:25