Firebase Realtime Database使用orderByChild equalTo查询提示无该用户如何解决
问题根因
你遇到的报错是3个核心错误共同导致的:
- 排序查询的字段路径填写错误:你要查询的
username字段存放在information子节点下,不能直接写orderByChild("username"),需要补全完整相对路径 - 查询返回的快照结构处理错误:
orderByChild()查询返回的快照是匹配结果的集合,哪怕只有1条匹配结果,也需要先遍历快照的子节点才能获取到用户数据 - 额外字段拼写错误:数据库中存储的全名字段是
fullname(全小写),你的代码中写的是fullName(驼峰),后续取值会返回null
修正后的代码
private void isUser() { username = (EditText) findViewById(R.id.edtUsername); password = (EditText) findViewById(R.id.edtPassword); final String userEnteredUsername = username.getText().toString().trim(); final String userEnteredPassword = password.getText().toString().trim(); DatabaseReference reference = FirebaseDatabase.getInstance().getReference("users"); // 修正1:补全username字段的完整相对路径 Query checkUser = reference.orderByChild("information/username").equalTo(userEnteredUsername); checkUser.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if (snapshot.exists()){ username.setError(null); // 修正2:遍历查询结果集合,拿到匹配的用户节点 for (DataSnapshot userSnapshot : snapshot.getChildren()) { String passwordFromDB = userSnapshot.child("information").child("password").getValue(String.class); // 加空判避免空指针崩溃 if(passwordFromDB != null && passwordFromDB.equals(userEnteredPassword)){ password.setError(null); // 修正3:字段名和数据库保持一致,用全小写的fullname String nameFromDB = userSnapshot.child("information").child("fullname").getValue(String.class); String usernameFromDB = userSnapshot.child("information").child("username").getValue(String.class); Intent intent = new Intent(getApplicationContext(), MainActivity.class); intent.putExtra("name", nameFromDB); intent.putExtra("username", usernameFromDB); startActivity(intent); // 匹配到就跳出循环,避免重复处理 break; } else { password.setError("Wrong Password"); password.requestFocus(); } } } else{ username.setError("No such User exist"); username.requestFocus(); } } @Override public void onCancelled(@NonNull DatabaseError error) { // 建议加个错误日志打印,方便后续排查问题 Log.e("FirebaseQuery", "查询失败: " + error.getMessage()); } }); }
额外注意事项
你的用户节点主键直接用了用户名,如果你后续允许用户修改用户名的话,这种结构会需要修改所有关联该用户的其他数据,建议后续优化用uid作为用户节点的主键。
内容的提问来源于stack exchange,提问作者error
相关产品推荐
相关产品推荐

