You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 19:39:01