从特定于Firebase的目录中检索数据(不使用FirebaseAuth)

时间:2019-02-15 01:59:39

标签: android firebase firebase-realtime-database

我想从Firebase特定目录中检索“用户名”之类的数据。这是我尝试过的过程,但是由于某种原因它没有起作用。以下是我编写的代码部分。我不知道它是否正确。

 FirebaseDatabase database = FirebaseDatabase.getInstance();
 DatabaseReference currentu=database.getReference("Users");
enter code here
  currentu.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            User user = dataSnapshot.getValue(User.class);
            loggedinuser.setText(user.getUsername());
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

用户帮助程序类:

public class User {

    private String email;
    private String username;
    private String password;

    public User(){

    }

    public User(String email, String username,String password ) {

        this.email = email;
        this.username=username;
        this.password = password;
    }



    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }


    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

这是我的Firebase数据库的图片。红色标记的字段(用户名)实际上是谁当前正在登录他的名字,我想在已设置getValue的文本字段(loggedinuser)中显示。 firebase data

现在此过程不起作用。如何检索当前登录的特定用户名?

注册课程。

public class SignUp extends AppCompatActivity {

FirebaseDatabase database;
DatabaseReference users;
EditText edtUsername,edtPassword,edtMail;
Button btnSignUp,back_login;
private static final String REQUIRED = "Required";


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    database = FirebaseDatabase.getInstance();
    users=database.getReference("Users");

    edtUsername=(EditText)findViewById(R.id.edtUsername);
    edtPassword=(EditText)findViewById(R.id.edtPassword);
    edtMail=(EditText)findViewById(R.id.edtMail);
    btnSignUp=(Button)findViewById(R.id.btnSignUp);
    back_login=(Button)findViewById(R.id.back_login);



    btnSignUp.setOnClickListener(new View.OnClickListener() {
                                     @Override
                                     public void onClick(View view) {
                                         submit();

                                     }
    }


    );
    back_login.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i = new Intent (getApplicationContext(),Login.class);
            startActivity(i);
        }
    });


  confirm();

}

private void submit(){

    final String em = edtMail.getText().toString();
    final String en=edtUsername.getText().toString();
    final String ep= edtPassword.getText().toString();
    if(android.util.Patterns.EMAIL_ADDRESS.matcher(em).matches());

    if  (TextUtils.isEmpty(em)){
        edtMail.setError(REQUIRED);
        return;
    }

    if (TextUtils.isEmpty(en)){

        edtUsername.setError(REQUIRED);
        return;
    }
    if (TextUtils.isEmpty(ep)){
        edtPassword.setError(REQUIRED);
        return;
    }

    Toast.makeText(this, "Processing...", Toast.LENGTH_SHORT).show();

    final User user = new User(
            edtMail.getText().toString(),
            edtUsername.getText().toString(),
            edtPassword.getText().toString());


    users.addListenerForSingleValueEvent(new ValueEventListener() {

                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    if (dataSnapshot.child(user.getUsername()).exists()) {
                        Toast.makeText(SignUp.this, "The username is Already Exist", Toast.LENGTH_SHORT).show();
                        setEditingEnabled(true);
                    }


                    else {
                        users.child(user.getUsername()).setValue(user);
                        Toast.makeText(SignUp.this, "Registration Successful", Toast.LENGTH_SHORT).show();
                       lukano();
                       confirmv();


                    }
                }


                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

}

这是login.class

public class Login extends AppCompatActivity {

FirebaseDatabase database;
DatabaseReference users;
ProgressBar pbar;

EditText edtUsername,edtPassword;
Button btnSignIn;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_login);
    database = FirebaseDatabase.getInstance();
    users=database.getReference("Users");

    edtUsername=(EditText)findViewById(R.id.edtUsername);
    edtPassword=(EditText)findViewById(R.id.edtPassword);
    btnSignIn=(Button)findViewById(R.id.btnSignIn);
     pbar = (ProgressBar) findViewById(R.id.pb1);
      pbar.setVisibility(View.INVISIBLE);


    btnSignIn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            signIn(edtUsername.getText().toString(),
                    edtPassword.getText().toString());
            pbar.setVisibility(View.VISIBLE);

        }
    });


}

private void signIn(final String username,final String password) {
    users.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.child(username).exists()){

                if(!username.isEmpty()){
                    User login = dataSnapshot.child(username).getValue(User.class);
                    if(login.getPassword().equals(password)){
                        Toast.makeText(Login.this,"Log in Successful",Toast.LENGTH_SHORT).show();
                        Intent s = new Intent(getApplicationContext(),Interface.class);
                        startActivity(s);
                        finish();
                    }
                    else {
                        Toast.makeText(Login.this, "Username or Password is Incorrect", Toast.LENGTH_SHORT).show();
                    }
                }

            else
                    Toast.makeText(Login.this, "Username is not Registered", Toast.LENGTH_SHORT).show();
                }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

1 个答案:

答案 0 :(得分:0)

在Firebase数据库中,“用户”子节点名称与内部的用户名相同。然后,firebase如何知道ab是尝试登录还是bb是尝试登录,依此类推。因此,首先在注册活动中使用此代码将无效。

users.child(user.getUsername()).setValue(user); //won't help later

firebase console中,打开您的项目,您可以看到Authentication标签,其中Firebase将Identifier(用户登录电子邮件ID)与唯一的User UID相关联。这可以帮助firebase确定谁登录(当然稍后再使用FirebaseAuth)。

在您的情况下,除非您先进行某种方式,否则“用户”节点下的那些子节点名称不会与您的登录名关联。

但是,由于您说过,您不想使用Firebase身份验证。我可以想到的是在注册活动中可以使用以下方法:

//users.child(user.getUsername()).setValue(user);
users.child(user.getEmail()).setValue(user);

在成功登录后在活动之间传递用户登录电子邮件ID。假设您有一个活动,您已经检索到该登录电子邮件ID并存储在变量中(假设在String loginName中)。然后,最后您可以将上述第一个代码用作:

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference currentu=database.getReference("Users").child(loginName);

currentu.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String username = dataSnapshot.child("username").getValue().toString();
        loggedinuser.setText(username);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

但是,如果您仍然坚持在“用户”节点的子节点中使用用户名。然后先将用户名和登录电子邮件ID关联起来,然后尝试解决。这可能对您有帮助。 How to provide user login with a username and NOT an email?

但是无论如何这样做都会暴露您的用户登录信息。 因此,最好尽可能使用FirebaseAuth。也是方便的。希望这能给您一些想法。