Firebase数据返回空值问题:loadUserInformation方法代码排查
看了你贴的loadUserInformation代码片段,这里有几个明显的坑可能导致数据库返回null,我帮你逐一拆解:
变量名拼写错误:你写的
usesrRef明显是打错了,应该是userRef吧?这个低级错误会让你的数据库引用指向一个不存在的节点,自然拿不到任何数据,返回null是必然的。UID变量未初始化/不匹配:代码里你获取了手机号
mNumber,但数据库引用却用了child(uid)——问题是uid从哪来的?我完全没看到它的赋值逻辑啊!如果你的用户节点是用手机号当key的,那应该把uid换成mNumber;如果是用Firebase Auth的用户UID,那得先获取当前登录用户的UID,比如:
String uid = FirebaseAuth.getInstance().getCurrentUser() != null ? FirebaseAuth.getInstance().getCurrentUser().getUid() : null; if (uid == null) { // 这里要处理用户没登录的情况,不然uid是null,节点肯定不存在 return; }
要是uid一直是null,那你访问的就是Users/null这个不存在的节点,返回null太正常了。
数据库路径不匹配:你得去Firebase控制台确认一下,你的用户数据是不是真的存在
Users/{uid}这个路径下?比如有没有把节点名写成User(单数),或者多了一层Profiles之类的子节点?路径错了,肯定找不到数据。权限规则限制:Firebase数据库默认的规则是只有认证用户才能读写,但如果你的用户还没登录,或者规则设置得更严格,那数据库会拒绝你的读取请求,表现就是返回null(或者触发
onCancelled回调)。你可以先临时把规则改成测试用的开放模式(上线前一定要改回来!)验证一下:
{ "rules": { ".read": true, ".write": true } }
另外,你的代码里profilePic = (ImageView) rootView.findVi...明显没写完,应该是findViewById(R.id.你的头像ID),虽然这不是数据库返回null的直接原因,但也是要修复的bug。
最后给你加个排查小技巧:在onDataChange里加日志,看看数据到底有没有返回:
@Override public void onDataChange(DataSnapshot dataSnapshot) { Log.d("FirebaseDebug", "数据是否存在:" + dataSnapshot.exists()); Log.d("FirebaseDebug", "返回的数据:" + dataSnapshot.getValue()); if (dataSnapshot.exists()) { // 这里再去读取具体字段赋值给视图 String userName = dataSnapshot.child("Name").getValue(String.class); EditText nameEt = (EditText) rootView.findViewById(R.id.Name); nameEt.setText(userName); } else { // 数据不存在的情况,给个提示什么的 } }
还有别忘了实现onCancelled回调,看看有没有权限错误或者其他异常:
@Override public void onCancelled(DatabaseError databaseError) { Log.e("FirebaseError", "读取失败:" + databaseError.getMessage()); }
内容的提问来源于stack exchange,提问作者user9493136

