如何在Firebase数据库中获取所有用户名称(不使用'usuarios'子节点)
解决Firebase获取所有用户名称的问题
嘿,别着急,我来帮你搞定这个小问题!
首先看你的代码,问题出在你在循环里硬编码了luisito这个具体的用户节点,还重复访问了usuarios子节点,这就导致循环没起到遍历所有用户的作用,只能拿到单个用户的名字。结合你的数据库结构(所有用户都存在usuarios节点下,每个子节点是一个用户ID,里面包含nombre字段),我们可以调整代码来实现需求:
正确的实现代码
首先确保你的数据库引用指向usuarios节点:
// 获取指向usuarios节点的引用 DatabaseReference usuariosRef = FirebaseDatabase.getInstance().getReference("usuarios");
然后修改监听器逻辑,遍历所有用户节点并提取名称:
usuariosRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // 遍历usuarios下的每一个用户节点 for (DataSnapshot userSnapshot : dataSnapshot.getChildren()) { // 直接从当前用户节点中获取nombre字段 String userName = userSnapshot.child("nombre").getValue(String.class); // 做个非空判断,避免空指针异常 if (userName != null) { Toast.makeText(UsuariosEnLineaActivity.this, userName, Toast.LENGTH_SHORT).show(); } } } @Override public void onCancelled(DatabaseError databaseError) { // 别忘了处理数据获取失败的情况 Toast.makeText(UsuariosEnLineaActivity.this, "获取用户数据失败:" + databaseError.getMessage(), Toast.LENGTH_SHORT).show(); } });
代码说明
dataSnapshot.getChildren()会返回usuarios节点下的所有子节点(也就是每一个用户的节点),循环里的userSnapshot就代表单个用户的全部数据。- 直接通过
userSnapshot.child("nombre")就能拿到该用户的名称,不需要再指定具体的用户名(比如luisito),这样就能遍历获取所有用户的名字了。
另外你提到“不使用'usuarios'子节点”,如果是不想在代码里硬写节点名称,可以把它定义成一个常量,比如:
private static final String USUARIOS_NODE = "usuarios"; DatabaseReference usuariosRef = FirebaseDatabase.getInstance().getReference(USUARIOS_NODE);
这样后续修改节点名称时只需要改常量即可,更灵活。
内容的提问来源于stack exchange,提问作者Luis Aguilar
相关产品推荐
相关产品推荐

