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

