从Firebase获取值

时间:2018-03-13 20:55:04

标签: java android firebase firebase-realtime-database

我是Firebase的新手,并决定让我的脚湿透。但是,我在查询中检索值时遇到问题。我基本上都试图获取密码值,但我相信它什么也没有返回。

Image

错误:

  

java.lang.NullPointerException:println需要一条消息

loginButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String username = usernameField.getText().toString();
                String password = passwordField.getText().toString();

                db.child("Users").orderByChild("username").equalTo(username).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if (dataSnapshot.exists()) {
                            //Get the password,and check it against the password field
                            Map<String, String> map = (Map<String, String>)dataSnapshot.getValue();

                            Log.d("result", map.get("password"));

                        } else {
                            Toast.makeText(getApplicationContext(), "Incorrect login details", Toast.LENGTH_SHORT).show();
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
            }
        });

我知道这不是很实用,但就像我说的那样,我只是在练习。

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

对Firebase数据库执行查询时,可能会有多个结果。因此快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果的列表。

onDataChange中的代码需要通过循环snapshot来处理snapshot.getChildren()列表的事实:

db.child("Users").orderByChild("username").equalTo(username).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot snapshot: dataSnapshot.getChildren()) {
            //Get the password,and check it against the password field
            Map<String, String> map = (Map<String, String>)snapshot.getValue();

            Log.d("result", map.get("password"));
        }
    }

答案 1 :(得分:0)

正确的数据库结构与代码中的引用不同,您应该更改一些内容

首先,您的Reference数据应该是这样的

 db.child("Users").child(uid).child("password").addValueEventListener...

其中uid是

的结果
 private FirebaseAuth mAtuh;

 mAuth = FirebaseAuth.getCurrentUser().getUid();

 String uid = mAuth ;

查看有关如何正确验证用户身份的官方文档

https://firebase.google.com/docs/auth/android/manage-users

您也可以实施Google登录:

https://firebase.google.com/docs/auth/android/google-signin

然后您可以像这样检索您的密码字段

// Attach a listener to read the data
ref.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String password = dataSnapshot.getValue(String.class);
        Log.e("The password is:",""+password);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
      Log.e("Error getting the password",""+databaseError.getCode());
    }
});

不使用mAuth对您的引用进行硬编码就像这样

db.child("Users").child("L7VR2mGZKnbReFqOlmP").child("password").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            if (dataSnapshot.exists()) {

            String password = dataSnapshot.getValue(String.class);
            Log.e("The password is:",""+password);

           }else
              {

              Toast.makeText(getApplicationContext(), "Incorrect login details", Toast.LENGTH_SHORT).show();

             }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
          Log.e("Error getting the password",""+databaseError.getCode());
        }
    });

希望有所帮助

快乐编码