Firebase Android无法获取数据库字段值返回null,代码问题排查求助
问题排查与修复方案
现有代码核心问题
- 多余的子节点遍历:代码中已经通过
rootRef.child("analysis_Client").child(searchUserId)直接定位到了目标用户的节点,此时onDataChange返回的dataSnapshot本身就包含对应用户下的Total、Rest、ProductNum字段,不需要再循环遍历dataSnapshot.getChildren(),循环会导致你在子字段的下一级找不存在的Total字段,自然返回null - 字段类型不匹配:如果数据库中这三个字段存储的是数字类型,直接调用
getValue(String.class)会因为类型不匹配返回空,需要先读取对应数字类型再按需转字符串 - 缺失监听器绑定逻辑:仅声明了ValueEventListener,没有调用
ref.addListenerForSingleValueEvent(valueEventListener)或者ref.addValueEventListener(valueEventListener)绑定监听器,请求根本不会发送到Firebase - 错误日志被注释:
onCancelled中的错误日志被关闭,无法排查权限不足、网络异常等问题
修正后代码示例
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference(); DatabaseReference ref = rootRef.child("analysis_Client").child(searchUserId); ValueEventListener valueEventListener = new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // 直接从当前用户节点快照读取字段,不需要循环 // 若字段为数字类型,先读取Long再转String String userTotal = String.valueOf(dataSnapshot.child("Total").getValue(Long.class)); String userRest = String.valueOf(dataSnapshot.child("Rest").getValue(Long.class)); String userProductNum = String.valueOf(dataSnapshot.child("ProductNum").getValue(Long.class)); // 后续可直接使用三个字段的值 } @Override public void onCancelled(@NonNull DatabaseError databaseError) { Log.d("FirebaseError", databaseError.getMessage()); // 务必打开错误日志排查问题 } }; // 绑定监听器,触发数据拉取 ref.addListenerForSingleValueEvent(valueEventListener);
额外检查项
- 确认
searchUserId的值和数据库中analysis_Client下的用户节点ID完全一致,大小写、特殊字符不要有误差 - 确认Firebase实时数据库的规则配置允许当前用户读取analysis_Client节点的权限
内容的提问来源于stack exchange,提问作者Yousef Hashem
相关产品推荐
相关产品推荐

