Firebase Realtime Database查询正常但getValue()取LoginPassword返回null如何解决
问题原因
- Firebase Realtime Database 使用
orderByChild()+equalTo()执行查询后返回的DataSnapshot是匹配结果的集合对象,而非单条用户数据。即使只有1条匹配的用户记录,该记录也存放在集合的子节点中(子节点key对应Login根节点下的用户唯一标识),直接对集合snapshot调用child("LoginPassword")无法定位到目标字段,因此返回null。 - 若自行遍历仍无法拿到字段,一般是遍历逻辑没有先访问集合下的用户子节点,直接对集合对象读取字段导致。
修复方案
需要做两处核心修正:
- 将查询初始化逻辑移到点击事件内部,保证每次查询都使用输入框最新输入的用户名
- 读取数据时先访问集合下第一条匹配的用户子节点,再读取密码字段
修复后的代码如下:
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
相关产品推荐
相关产品推荐

