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

