【问题标题】:getvalue() in query return null from Firebase Realtime Database查询中的 getvalue() 从 Firebase 实时数据库返回 null
【发布时间】:2021-09-08 18:12:22
【问题描述】:

the databas

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");
        Query query = rootRef.orderByChild("LoginUserName").equalTo(testInputTxt.getText().toString());



        readBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                query.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot snapshot) {

                        String passwordUser = snapshot.child("LoginPassword").getValue(String.class);
                        testInputTxt.setText(passwordUser+"tatata");

                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError error) {

                    }
                });
            }
        });

查询工作正常,它检测到用户存在,但我想检索 LoginPassword 的值,但它返回 null 我尝试了 for DataBase....:快照代码,但它不会检测到

【问题讨论】:

  • 你能提供更多上下文吗

标签: java android firebase firebase-realtime-database


【解决方案1】:

由于您使用的是 Query 对象,这意味着您可能会从数据库中获得多个结果。话虽如此,您必须使用对 .getChildren() 的调用来遍历结果,如以下代码行所示:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference loginRef = rootRef.child("Login");
Query query = loginRef.orderByChild("LoginUserName").equalTo(testInputTxt.getText().toString());
query.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            for (DataSnapshot ds : task.getResult().getChildren()) {
                String passwordUser = ds.child("LoginPassword").getValue(String.class);
                testInputTxt.setText(passwordUser+"tatata");
            }
        } else {
            Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
        }
    }
});

还请注意,如果两个用户具有相同的“LoginUserName”,那么您的TextView 将始终显示最后一个的值。因此,请始终确保拥有唯一的用户名。要检查用户名是否已经存在,请查看我在以下帖子中的回答:

【讨论】:

  • 我想在更改标签给我的代码后添加问题:“D/TAG:客户端离线”我该如何解决这个问题?
  • 您的客户很可能离线。如果您很难解决它,请在 StackOverflow 上发布一个新问题,使用它自己的 MCVE,以便我和其他 Firebase 开发人员可以帮助您。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 1970-01-01
  • 2019-05-15
  • 2019-05-24
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多