[英]How can I read nested data (hashmap) in Firebase RealTime Database
[英]How can I check user had registered and match data between data on firebase authentication and firebase Realtime Database?
這是我第一次在StackOverflow中提問。 所以,我想在這個論壇上分享一個問題。 我已經注冊了一個帳戶進行firebase身份驗證並在Firebase Realtime-Database上記錄。 你可以看到這些照片
https://i.ibb.co/TcqDhF7/image.png
https://i.ibb.co/Zc1YnLY/image.png
問題出在登錄上。 當我登錄時,我預計Firebase可以匹配身份驗證和數據庫之間的數據,但這是相反的。 問題是Can Firebase可以在身份驗證和數據庫上的數據記錄之間匹配用戶數據嗎?
我試過像這樣修改我的Login Activity類
LoginActivity.java
package id.co.dolansemarang.loginfirebaseds;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
public class LoginActivity extends AppCompatActivity {
Button btnLogin;
EditText edtEmailLogin, edtPasswordLogin;
FirebaseAuth firebaseAuthLogin;
DatabaseReference userRefLogin;
FirebaseUser curUser;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
btnLogin = findViewById(R.id.btn_login);
edtEmailLogin = findViewById(R.id.edt_email_login);
edtPasswordLogin = findViewById(R.id.edt_password_login);
firebaseAuthLogin = FirebaseAuth.getInstance();
curUser = FirebaseAuth.getInstance().getCurrentUser();
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String email = edtEmailLogin.getText().toString();
final String password = edtPasswordLogin.getText().toString();
if (email.isEmpty()) {
Toast.makeText(LoginActivity.this, "Masukkan email", Toast.LENGTH_SHORT).show();
} else {
if (password.isEmpty()) {
Toast.makeText(LoginActivity.this, "Masukkan password", Toast.LENGTH_SHORT).show();
} else {
firebaseAuthLogin.signInWithEmailAndPassword(email, password).addOnCompleteListener(LoginActivity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
userRefLogin = FirebaseDatabase.getInstance().getReference().child("Users").child(curUser.getUid());
userRefLogin.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
//ambil data password
String passwordFromFirebase = dataSnapshot.child("password").getValue().toString();
//validasi password dengan password di edit text
if (password.equals(passwordFromFirebase)) {
// menyimpan data ke local storage (handphone)
// SharedPreferences sharedPreferences = getSharedPreferences(USERNAME_KEY, MODE_PRIVATE);
// SharedPreferences.Editor editor = sharedPreferences.edit();
// editor.putString(username_key, etUsername.getText().toString());
// editor.apply();
startActivity(new Intent(LoginActivity.this, MainActivity.class));
} else {
Toast.makeText(LoginActivity.this, "Pasword tidak cocok", Toast.LENGTH_SHORT).show();
}
} else {
Toast.makeText(LoginActivity.this, "Username tidak terdaftar", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toast.makeText(LoginActivity.this, "Pasword tidak cocok", Toast.LENGTH_SHORT).show();
}
});
} else {
Toast.makeText(LoginActivity.this, "Pasword tidak cocok", Toast.LENGTH_SHORT).show();
Log.w("Pesan", "Gagal Masul");
}
}
});
}
}
}
});
}
}
我希望firebase可以檢查兩者的匹配密碼和電子郵件數據,這樣當我登錄應用程序時,Firebase會檢查Firebase身份驗證和數據庫上的電子郵件和密碼。 我需要幫助 :(
在這里您可以找到已注冊的電子郵件ID: -
private void loginUserWithFirebase(String email, String password) {
firebaseAuthLogin.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
progressDialog.dismiss();
if (task.isSuccessful()) {
// here is user registered
startActivity(new Intent(LoginActivity.this, MainActivity.class));
}
else{
// here if your is not registered or any elese error will show
Toast.makeText(getContext(), "" + task.getException().toString(), Toast.LENGTH_SHORT).show();
}
}
});
}
登錄后,獲取用戶Uid然后使用該id調用realTime數據庫,如果datasnapshot為null,那么用戶還沒有注冊,否則你可以檢索他已經注冊的用戶。 我是這樣做的:
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("users/"+uid);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//Log.d("dataSnapShotValue",""+dataSnapshot.getValue());
if (dataSnapshot.getValue()!=null){
// User exist
}else{
// user dosn't exist
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
System.out.println("The read failed: " + databaseError.getCode());
}
});
> firebase will check it Self User is Authenticated or not so you can not
to check Manually.
private void loginUserWithFirebase(String email, String password) {
firebaseAuthLogin.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
startActivity(new Intent(LoginActivity.this, MainActivity.class));
}
else{
Toast.makeText(getContext(), "" + task.getException().toString(), Toast.LENGTH_SHORT).show();
}
}
});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.