如何使用Java获取Firebase数据库列表中的所有字段值
问题根因
你的代码存在两处核心错误导致返回值为null:
- 你调用
addChildEventListener()监听的是lectureRank节点下的直接子节点,触发onChildAdded时返回的snapshot本身就是student_status_list/student_uuid_list/background_color_list这类子节点,你再从这些子节点中查找同名child自然找不到,返回null。 - 上述三个字段都是数组类型,你用
getValue(String.class)尝试读取为字符串,类型不匹配也会返回null。
解决方案
将ChildEventListener替换为ValueEventListener,直接读取lectureRank节点的全部字段,按数组类型解析后添加到对应列表即可,修改后的代码如下:
private void listViewDataListener() { FirebaseDatabase .getInstance() .getReference(classCreatorPhoneNo + "/" + "class_list" + "/" + classUuid + "/" + "attendance" + "/" + attendanceDate + "/" + subjectUuid + "/" + lectureRank) .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { // 先清空旧数据避免重复添加 studentStatusList.clear(); studentUuidList.clear(); cardBackgroundColor.clear(); // 按数组类型读取对应字段 List<String> statusList = (List<String>) snapshot.child("student_status_list").getValue(); List<String> uuidList = (List<String>) snapshot.child("student_uuid_list").getValue(); List<String> colorList = (List<String>) snapshot.child("background_color_list").getValue(); // 非空判断后添加到全局列表 if (statusList != null) studentStatusList.addAll(statusList); if (uuidList != null) studentUuidList.addAll(uuidList); if (colorList != null) cardBackgroundColor.addAll(colorList); // 如有需要可在此处调用列表适配器的notifyDataSetChanged刷新界面 } @Override public void onCancelled(@NonNull DatabaseError error) { // 打印错误信息排查权限、路径错误问题 Log.e("FirebaseRead", "数据读取失败: " + error.getMessage()); } }); }
额外排查点
- 确认路径中所有变量(
classCreatorPhoneNo/classUuid/attendanceDate等)的取值和数据库结构完全一致,拼写错误也会导致读不到值 - 确认当前账号拥有该节点的读取权限,权限不足会触发
onCancelled回调
内容的提问来源于stack exchange,提问作者Vinayak Sutar
相关产品推荐
相关产品推荐

