我想从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)中显示。
现在此过程不起作用。如何检索当前登录的特定用户名?
注册课程。
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) {
}
});
}
答案 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。也是方便的。希望这能给您一些想法。