上下文:在我的Firebase数据库中,有一个名为“客户端”的父项,根据将其注册为哪个客户端,将数据存储在“供应商”或“食客”中。
问题:已注册的“供应商”可以登录为“食客”,“食客”可以登录为“供应商”。使用当前代码,应用程序仍允许“供应商”登录“食客”屏幕,反之亦然。
我需要做什么::仅允许“供应商”登录“供应商”屏幕,并在“食者”屏幕中登录“食者”。
错误:当Eater或供应商登录
上的Eater屏幕时,出现此崩溃@Overridepublic void onDataChange
“ java.lang.NullPointerException:尝试在com.example.zzyzj.eloteroman.login上的空对象引用上调用虚拟方法'boolean java.lang.Object.equals(java.lang.Object)' .EatCornLoginActivity $ 4.onDataChange“
loginButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
circProgressBar.setVisibility(View.VISIBLE);
final String emailUser = emailEditText.getText().toString();
final String passwordUser = passwordEditText.getText().toString();
firebaseAuth.signInWithEmailAndPassword(emailUser, passwordUser).addOnCompleteListener(EatCornLoginActivity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()){
circProgressBar.setVisibility(View.INVISIBLE);
} else {
checkIfUserIsEaterOrVendor();
}
}
});
}
});
}
public void checkIfUserIsEaterOrVendor(){
FirebaseDatabase.getInstance().getReference().
child("Clients").
child(FirebaseAuth.getInstance().getCurrentUser().getUid()).
child("Eater").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue().equals("Eater")) {
//Code if the user is Eater
circProgressBar.setVisibility(View.INVISIBLE);
Toast.makeText(EatCornLoginActivity.this, R.string.login_success_toast, Toast.LENGTH_SHORT).show();
startActivity(new Intent(EatCornLoginActivity.this, MapsActivity.class));
} else {
//Code if the user is Vendor trying to login as Eater
circProgressBar.setVisibility(View.INVISIBLE);
Toast.makeText(EatCornLoginActivity.this, R.string.login_failed_toast, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Toast.makeText(getBaseContext(), databaseError.getMessage(),
Toast.LENGTH_SHORT).show();
}
});
}
答案 0 :(得分:1)
您可以使用SharedPreferences。因此,您可以存储一个用户ID,其值为注册的用户类型,并检查登录名是否与您的用户ID匹配,以便您登录。</ p>
SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("com.example.pc.it7project.data", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(firebaseAuth.getCurrentUser().getUid(), "Vendor");
editor.apply();
使用此代码,您将获得共享首选项的价值
SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("com.example.pc.it7project.data", Context.MODE_PRIVATE);
String sc = sharedPref.getString(FirebaseAuth.getInstance().getUid(), "");
然后检查
if(sc.equals("Vendor"))
{
//Put Your Code Here
}
希望这对您有帮助!
谢谢。
答案 1 :(得分:1)
用于注册:
您应该首先询问用户,该用户想注册为供应商还是食用者。一旦 用户自行注册,然后将其类型保存到Firebase数据库中。
e-g bleow:
注册用户:
+ user_key:(FirebaseAuth.getInstance()。getCurrentUser()。getUid());
+ user_type:供应商/食者(在user_key节点下)
用于登录:
您必须有两个按钮才能区分登录e-g登录为供应商还是 以食客身份登录。 e-g如果用户单击作为供应商的登录名,然后传递其 通过意图输入来登录活动。
Intent intent = new Intent(StartScreen.this,LoginActivity.class);
intent.putExtra("user_type","vendor");
startActivity(intent);
一旦验证了用户身份,然后检查其类型
if (!task.isSuccessful() && client_db ){
circProgressBar.setVisibility(View.INVISIBLE);
Toast.makeText(EatCornLoginActivity.this, R.string.login_failed_toast, Toast.LENGTH_SHORT).show();
} else {
circProgressBar.setVisibility(View.INVISIBLE);
Toast.makeText(EatCornLoginActivity.this, R.string.login_success_toast, Toast.LENGTH_SHORT).show();
// If Login/Registration Successful send user to MapsActivity
checkUserValidation
}
getIntent()。getStringExtra(“ user_type”),将给出您要输入的类型 从StratScreen.this传递过来,所以如果您的user_type存在,那么您 将传递到下一个活动,否则显示错误的吐司
public void checkUserValidation(){
FirebaseDatabase.getInstance().getReference().child("registered_user").
child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(getIntent().getStringExtra("user_type")).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue() != null) {
startActivity(new Intent(EatCornLoginActivity.this, MapsActivity.class));
}else{
Log.e("notify","Error in login");
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
PS:
如果您要使用SharePreferences,那么很容易做到,但是一个 如果用户清除缓存或卸载,则可能会出现问题,然后重新安装 应用程序将无法找到 共享首选项文件。共享首选项将数据存储在本地文件中。
答案 2 :(得分:1)
我认为解决此问题的一种好方法是在Firebase数据库中为每个用户添加一个新字段,指示该字段是供应商还是Eater。创建帐户时可以填充此字段。接下来,当有人要登录时,您应该首先检查它是试图在供应商屏幕还是Eater屏幕上登录的供应商,反之亦然。这样,您将确定用户的类型。您可以在实现中做到这一点,还是我错过了什么?
示例功能
public void checkUserType(){
FirebaseDatabase.getInstance().getReference().
child("Users").
child(FirebaseAuth.getInstance().getCurrentUser().getUid()).
child("user_type").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.getValue().equals("Vendor")) {
//Code if the user is Vendor depending on the screen
} else {
//Code if the user is Eater depending on the screen
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
log.e(databaseError);
}
});
}
答案 3 :(得分:1)
您应该首先登录并获取用户ID,然后使用该ID查询食者参考,然后如果该用户存在,请转到食者屏幕,否则请转到供应商屏幕
text