Android Firebase读取子节点levelId返回null值如何解决
问题根因
读取返回null是因为你写的数据库引用路径和实际存储结构不匹配:
- 你当前代码里的路径是
根节点/Users/levelId,但从数据库快照可以看到,levelId并不是Users节点的直接子属性。Users节点下第一层是用户的唯一UID子节点,levelId、userId这些字段都存在每个UID对应的子节点内部。 - 你写的路径在数据库中不存在,
DataSnapshot拿到的是空节点,调用getValue()自然返回null。
修复代码
你需要先获取当前登录用户的UID,补全路径中缺失的UID层级,再读取对应字段:
// 获取当前登录用户的UID,未登录状态下需要先完成登录逻辑再执行后续代码 String currentUserUid = FirebaseAuth.getInstance().getCurrentUser().getUid(); // 构建正确的引用路径:根节点/Users/当前用户UID DatabaseReference userRef = FirebaseDatabase.getInstance().getReference() .child("Users") .child(currentUserUid); userRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { // 先判断节点存在再取值,避免空指针 if (!snapshot.exists()) return; // 分别读取两个需要的字段 String levelId = snapshot.child("levelId").getValue(String.class); String userId = snapshot.child("userId").getValue(String.class); // 给控件赋值 lvlHint.setText(levelId); } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(MainActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show(); } });
补充说明
- 如果需要读取
Users下所有用户的对应字段,不要在路径中直接拼接字段名,需要遍历Users下的所有UID子节点,再逐个取内部的levelId、userId属性 - 取值前务必通过
snapshot.exists()校验节点有效性,避免空指针崩溃 - 如果修正路径后依然读不到数据,检查Firebase数据库权限规则,确认当前登录用户拥有对应节点的读取权限,具体报错信息可以在
onCancelled回调中打印查看
你的数据库结构参考:
内容的提问来源于stack exchange,提问作者Syed Faizan
相关产品推荐
相关产品推荐


