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

Firebase Realtime Database查询正常但getValue()取LoginPassword返回null如何解决

问题原因
  • Firebase Realtime Database 使用orderByChild()+equalTo()执行查询后返回的DataSnapshot是匹配结果的集合对象,而非单条用户数据。即使只有1条匹配的用户记录,该记录也存放在集合的子节点中(子节点key对应Login根节点下的用户唯一标识),直接对集合snapshot调用child("LoginPassword")无法定位到目标字段,因此返回null。
  • 若自行遍历仍无法拿到字段,一般是遍历逻辑没有先访问集合下的用户子节点,直接对集合对象读取字段导致。
修复方案

需要做两处核心修正:

  1. 将查询初始化逻辑移到点击事件内部,保证每次查询都使用输入框最新输入的用户名
  2. 读取数据时先访问集合下第一条匹配的用户子节点,再读取密码字段

修复后的代码如下:

setContentView(R.layout.activity_main);
Button readBtn = (Button) findViewById(R.id.readBtn);
EditText testInputTxt = (EditText) findViewById(R.id.testInputTxt);
rootRef = FirebaseDatabase.getInstance().getReference().child("Login");

readBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // 每次点击都使用输入框最新内容生成查询
        Query query = rootRef.orderByChild("LoginUserName").equalTo(testInputTxt.getText().toString());
        query.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                if(snapshot.exists()){
                    // 取第一条匹配的用户子节点
                    DataSnapshot userSnapshot = snapshot.getChildren().iterator().next();
                    String passwordUser = userSnapshot.child("LoginPassword").getValue(String.class);
                    testInputTxt.setText(passwordUser+"tatata");
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                // 可按需添加错误处理逻辑
            }
        });
    }
});

内容的提问来源于stack exchange,提问作者Christian Jake Managase

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:57:04