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

Firebase Android 显示错误用户问题求助

解决应用显示最新注册用户而非已登录用户数据的问题

嘿,我看你遇到的问题是应用现在显示的是最新注册用户的信息,而不是当前已登录用户的对吧?这是因为你当前的代码是监听整个userInfos节点下的所有子节点,onChildAdded会逐个返回所有用户数据,最后一次触发时覆盖了之前的变量,所以自然显示的是最新注册的那个用户。咱们来调整代码,精准获取当前登录用户的数据:

核心思路

Firebase中通常用用户的UID(唯一标识)作为用户数据节点的键,所以我们需要先拿到当前登录用户的UID,再直接查询该UID对应的节点数据,而不是监听所有用户。

具体修改步骤

  1. 获取当前登录用户的UID
    首先通过Firebase Auth获取当前登录的用户实例,拿到其唯一UID:

    FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
    if (currentUser != null) {
        String userId = currentUser.getUid();
        // 后续用这个userId定位到用户数据节点
    } else {
        // 处理用户未登录的场景,比如提示或跳转登录页
    }
    
  2. 替换监听方式,精准查询当前用户数据
    把原来监听所有子节点的ChildEventListener改成针对单个用户节点的ValueEventListener,这样只会获取当前登录用户的数据:

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
    
    if (currentUser != null) {
        String userId = currentUser.getUid();
        // 定位到当前用户的专属数据节点
        DatabaseReference userRef = database.getReference("userInfos").child(userId);
        
        userRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                UserInformation userInformation = dataSnapshot.getValue(UserInformation.class);
                if (userInformation != null) {
                    // 这里更新你的UI组件,比如设置名字
                    vorname.setText(userInformation.getVorname());
                    // 其他用户字段同理处理
                }
            }
    
            @Override
            public void onCancelled(DatabaseError databaseError) {
                // 处理数据读取失败的情况,打印错误日志
                Log.e("UserInfoLoad", "读取用户数据失败", databaseError.toException());
            }
        });
    } else {
        // 用户未登录时的处理逻辑
        Toast.makeText(getApplicationContext(), "请先登录账号", Toast.LENGTH_SHORT).show();
        // 示例:跳转到登录页面
        startActivity(new Intent(this, LoginActivity.class));
        finish();
    }
    

为什么原来的代码会显示最新用户?

原来的addChildEventListener会遍历userInfos下的每一个用户节点,每触发一次onChildAdded,userInformation变量就会被新的用户数据覆盖。当所有节点遍历完成后,变量里存储的就是最后一个被处理的节点数据——也就是最新注册的用户。而通过UID直接定位节点,就能避免这种遍历覆盖的问题,精准获取当前登录用户的信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:19:29