Firebase Android 显示错误用户问题求助
解决应用显示最新注册用户而非已登录用户数据的问题
嘿,我看你遇到的问题是应用现在显示的是最新注册用户的信息,而不是当前已登录用户的对吧?这是因为你当前的代码是监听整个userInfos节点下的所有子节点,onChildAdded会逐个返回所有用户数据,最后一次触发时覆盖了之前的变量,所以自然显示的是最新注册的那个用户。咱们来调整代码,精准获取当前登录用户的数据:
核心思路
Firebase中通常用用户的UID(唯一标识)作为用户数据节点的键,所以我们需要先拿到当前登录用户的UID,再直接查询该UID对应的节点数据,而不是监听所有用户。
具体修改步骤
获取当前登录用户的UID
首先通过Firebase Auth获取当前登录的用户实例,拿到其唯一UID:FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); if (currentUser != null) { String userId = currentUser.getUid(); // 后续用这个userId定位到用户数据节点 } else { // 处理用户未登录的场景,比如提示或跳转登录页 }替换监听方式,精准查询当前用户数据
把原来监听所有子节点的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
相关产品推荐
相关产品推荐

