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

Android Studio中获取Firebase数据库节点名称并存为列表无数据问题

无法获取Firebase数据库节点名称并填充列表的问题

我想要获取Firebase数据库中所有节点的名称并将其存储为列表,但运行代码后列表中没有任何数据。以下是我编写的代码:

FirebaseDatabase firebaseDatabase  = FirebaseDatabase.getInstance();
DatabaseReference databaseReference = firebaseDatabase.getReference();
databaseReference.child("users").child("students");
databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
                CourseRegistrationModel courseRegistrationModel = dataSnapshot.getValue(CourseRegistrationModel.class);
                courseRegistrationModelArrayList.add(courseRegistrationModel);
            }

            requireActivity.runOnUiThread(() -> {
                CourseRegistrationAdapter courseRegistrationAdapter = new CourseRegistrationAdapter(requireActivity, onCourseAddedListener, courseRegistrationModelArrayList);
                fragmentCourseRegistrationBinding.registerCoursesList.setAdapter(courseRegistrationAdapter);
            });
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            requireActivity.runOnUiThread(() -> Toast.makeText(requireActivity, "" + error.getMessage(), Toast.LENGTH_SHORT).show());
        }
    });

我的数据库结构如下:
数据库结构


问题分析与修复

1. 核心错误:引用路径未生效

你调用databaseReference.child("users").child("students")后,没有将返回的新引用赋值给databaseReference变量,导致后续监听的还是数据库根节点,而非目标的users/students节点。根据你的数据库结构,数据都在users/students下,监听根节点自然拿不到需要的数据。

2. 需求与代码不匹配

你的目标是获取节点名称,但代码里在尝试将节点值转为CourseRegistrationModel对象。如果只需要节点名称,直接调用dataSnapshot.getKey()即可;如果需要完整模型,要确保模型类字段和数据库节点完全匹配。

修复后的代码示例

FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
// 直接创建并指向目标节点的引用
DatabaseReference databaseReference = firebaseDatabase.getReference().child("users").child("students");

// 监听数据变化前先清空列表,避免重复数据
courseRegistrationModelArrayList.clear();

databaseReference.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
            // 方案1:仅获取节点名称(需将列表类型改为List<String>)
            String nodeName = dataSnapshot.getKey();
            // nodeNameList.add(nodeName);

            // 方案2:获取完整模型对象(确保字段匹配)
            CourseRegistrationModel courseModel = dataSnapshot.getValue(CourseRegistrationModel.class);
            if (courseModel != null) {
                courseRegistrationModelArrayList.add(courseModel);
            }
        }

        requireActivity.runOnUiThread(() -> {
            CourseRegistrationAdapter adapter = new CourseRegistrationAdapter(requireActivity, onCourseAddedListener, courseRegistrationModelArrayList);
            fragmentCourseRegistrationBinding.registerCoursesList.setAdapter(adapter);
            adapter.notifyDataSetChanged(); // 通知适配器数据更新
        });
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        requireActivity.runOnUiThread(() -> Toast.makeText(requireActivity, error.getMessage(), Toast.LENGTH_SHORT).show());
    }
});

额外检查项

  • 数据库权限:确保Firebase实时数据库的读取权限开启,否则会触发onCancelled回调。开发阶段可临时设置规则:
    {
      "rules": {
        ".read": true,
        ".write": true
      }
    }
    
    上线前务必修改为安全的权限规则,限制仅授权用户可访问。
  • 模型类字段匹配:如果使用方案2获取模型对象,CourseRegistrationModel的字段名称、类型必须和数据库中的节点完全一致(包括大小写),否则会出现解析失败,对象为null的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 17:07:51