Firebase查询异常:无法显示当前用户已订阅的群组
问题:无法获取用户已订阅的群组数据
需要展示当前用户已订阅的群组,用户ID存储在群组的Members子节点中,但在主Activity中使用if条件后无法获取到任何群组数据。
错误代码片段
if (snapshot.child("Members").child(FirebaseAuth.getInstance().getUid()).exists());
完整错误代码
FirebaseDatabase.getInstance().getReference().child("Groups").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { list.clear(); for (DataSnapshot dataSnapshot : snapshot.getChildren()) { if (dataSnapshot.exists()) { if (snapshot.child("Members").child(FirebaseAuth.getInstance().getUid()).exists()); Group group = dataSnapshot.getValue(Group.class); list.add(group); } } adapter.notifyDataSetChanged(); } @Override public void onCancelled(@NonNull DatabaseError error) { } });
问题分析
- 循环内判断用户是否在群组
Members中时,错误使用了根快照snapshot,应该使用当前遍历到的群组快照dataSnapshot,否则会一直检查根节点下的Members,而非当前群组的Members。 - if条件末尾多了分号
;,导致判断逻辑完全无效,不管条件是否成立,都会执行后续的添加群组操作。
修正后的代码
FirebaseDatabase.getInstance().getReference().child("Groups").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { list.clear(); String currentUserId = FirebaseAuth.getInstance().getUid(); for (DataSnapshot dataSnapshot : snapshot.getChildren()) { // 检查当前群组的Members节点是否包含当前用户ID if (dataSnapshot.child("Members").child(currentUserId).exists()) { Group group = dataSnapshot.getValue(Group.class); list.add(group); } } adapter.notifyDataSetChanged(); } @Override public void onCancelled(@NonNull DatabaseError error) { // 可添加错误处理逻辑 } });
修正说明
- 将判断条件中的
snapshot替换为dataSnapshot,确保检查的是当前遍历到的群组下的Members节点。 - 移除if条件末尾的分号,让条件逻辑生效,只有当用户在当前群组的
Members中时,才将群组添加到列表。 - 提前获取当前用户ID,避免重复调用
FirebaseAuth.getInstance().getUid(),提升代码简洁性。
内容的提问来源于stack exchange,提问作者Agam Sharma
相关产品推荐
相关产品推荐

