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

如何在TextView中显示Firebase数据库中已认证用户的信息?

解决Firebase认证用户数据在TextView显示的问题

看起来你已经搞定了用户数据的存储,卡在读取并显示到TextView这一步了对吧?别慌,咱们一步步来解决这个问题:

1. 先确认数据库权限是否正确

首先得保证已认证用户能读取自己的数据,不然就算代码写对了也拿不到数据。打开Firebase控制台的Realtime Database规则,改成下面这样:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "$uid": {
      ".read": "auth.uid === $uid",
      ".write": "auth.uid === $uid"
    }
  }
}

这个规则既保证了安全性,又让每个用户只能访问自己的节点数据。

2. 在Activity里实现读取与UI绑定

假设你的布局里有四个TextView,分别对应ID、姓名、邮箱、手机号,咱们直接上代码:

第一步:初始化Firebase和控件

在Activity的onCreate方法里完成初始化:

private FirebaseAuth mAuth;
private DatabaseReference mDatabase;
private TextView tvId, tvName, tvMail, tvMobile;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_activity_layout);

    // 绑定布局里的TextView
    tvId = findViewById(R.id.tv_id);
    tvName = findViewById(R.id.tv_name);
    tvMail = findViewById(R.id.tv_mail);
    tvMobile = findViewById(R.id.tv_mobile);

    // 初始化Firebase实例
    mAuth = FirebaseAuth.getInstance();
    mDatabase = FirebaseDatabase.getInstance().getReference();
}

第二步:读取用户数据并更新UI

最好在onStart方法里处理,因为每次Activity回到前台都可以刷新数据:

@Override
protected void onStart() {
    super.onStart();
    FirebaseUser currentUser = mAuth.getCurrentUser();
    if (currentUser != null) {
        String userId = currentUser.getUid();
        // 读取当前用户节点的数据,用一次性监听避免重复回调
        mDatabase.child(userId).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                // 把快照解析成你的AppUser对象
                AppUser appUser = snapshot.getValue(AppUser.class);
                if (appUser != null) {
                    // 直接把数据设置到TextView上
                    tvId.setText(appUser.getId());
                    tvName.setText(appUser.getName());
                    tvMail.setText(appUser.getMail());
                    tvMobile.setText(appUser.getMobile());
                } else {
                    Toast.makeText(YourActivity.this, "未找到用户数据", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                // 读取失败时给个提示
                Toast.makeText(YourActivity.this, "读取数据失败:" + error.getMessage(), Toast.LENGTH_SHORT).show();
            }
        });
    } else {
        // 用户没登录的话,跳转到登录页或者提示
        Toast.makeText(this, "请先登录账号", Toast.LENGTH_SHORT).show();
        startActivity(new Intent(this, LoginActivity.class));
        finish();
    }
}

3. 检查你的AppUser类是否符合要求

Firebase解析对象的时候有两个关键要求,别忽略了:

  • 必须要有无参构造函数(Firebase需要用它来创建对象实例)
  • 所有属性的getter方法命名要规范(比如name属性对应getName(),mail对应getMail())

给你个标准的AppUser类示例:

public class AppUser {
    private String name;
    private String mobile;
    private String mail;
    private String id;

    // 无参构造函数,必须要有!
    public AppUser() {}

    // 带参数的构造函数,和你存数据时用的对应
    public AppUser(String name, String mobile, String mail, String id) {
        this.name = name;
        this.mobile = mobile;
        this.mail = mail;
        this.id = id;
    }

    // Getter方法,名称要和属性严格对应
    public String getName() {
        return name;
    }

    public String getMobile() {
        return mobile;
    }

    public String getMail() {
        return mail;
    }

    public String getId() {
        return id;
    }
}

常见坑点排查

  • 路径不对:你存数据时用的是user.getUid()作为节点,读取时一定要用同样的路径,别写错了
  • UI没更新:Firebase读取是异步的,必须在onDataChange回调里更新UI,不能在主线程直接同步读取
  • AppUser解析为null:检查无参构造函数有没有,getter方法是不是都写了,属性名称和数据库里的是不是完全一致(比如数据库里是mobile,类里不能写成phone)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:05:27