#android #firebase #firebase-realtime-database
# #Android #огневая база #firebase-база данных в реальном времени
Вопрос:
Здравствуйте, я создаю приложение, в котором есть две роли: администратор и студент. В настоящее время административная часть выполняет свою работу и регистрируется в назначенном действии. Я не знаю, как разделить две роли, используя базу данных в реальном времени и используя метод моментального снимка.
Поэтому я добавил поля «isAdmin» и «isStudent», я думал добавить хотя бы значение. Таким образом, каждый раз, когда пользователь будет входить в систему, он будет видеть, есть ли у пользователя «isAdmin» и имеет значение, и будет перенаправлять на другие действия, то же самое относится и к «isStudent».
Дело в том, что я не знаю, как это сделать, нет snapshot.hasChild(«isAdmin»).equals(«1») или прочее. Единственное, что мне нужно, это то, что пользователь войдет в систему, если учетная запись имеет поле «isAdmin» /»isStudent» и имеет значение.
вот мой код в части входа.
btn_login.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
checkField(userID);
checkField(password);
if(valid){
mAuth.signInWithEmailAndPassword(userID.getText().toString() "@gmail.com".trim(), password.getText().toString().trim()).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
Toast.makeText(LoginActivity.this, "Logged in Successfully", Toast.LENGTH_SHORT).show();
CheckUserAccessLevel(authResult.getUser().getUid());
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Toast.makeText(LoginActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
}
});
итак, в основном я вызываю функцию CheckUserAccessLevel, в которой она фильтрует роль пользователя.
Итак, это моя функция CheckUserAccessLevel… Но он предназначен только для учетной записи администратора, но не для учетной записи учащегося
private void CheckUserAccessLevel(String uid) {
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Users/" uid);
databaseReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if(snapshot.hasChild("isAdmin")){
Toast.makeText(LoginActivity.this, "Logged in as Admin", Toast.LENGTH_SHORT).show();
startActivity(new Intent(getApplicationContext(), WelcomeAdminActivity.class));
finish();
}
else if (snapshot.hasChild("isStudent")){
Toast.makeText(LoginActivity.this, "Logged in as Student", Toast.LENGTH_SHORT).show();
startActivity(new Intent(getApplicationContext(), WelcomeStudentActivity.class));
finish();
}
else {
FirebaseAuth.getInstance().signOut();
startActivity(new Intent(getApplicationContext(), LoginActivity.class));
finish();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
Toast.makeText(LoginActivity.this, error.getMessage(), Toast.LENGTH_SHORT).show();
}
});
}
это моя база данных в реальном времени
Комментарии:
1. потому что вы назначили
isStudent =2
иisAdmin = 1
в базе данных. 1 означает true, следовательно, он всегда выполняет намерение администратора. Если нет, то, пожалуйста, добавьте дополнительную информацию о ваших полях.2. @ShoaibK. здравствуйте, вы знаете, какое ключевое слово я должен использовать, чтобы получить значение isStudent? используя snapshot.hasChild(«isStudent»)? здесь нет snapshot.getstring, хотя. я немного сбит с толку.
3. В чем проблема
if(snapshot.hasChild("isAdmin")){
? Когда вы просматриваете этот код в отладчике, что вы ожидаете от этой строки? И что он делает вместо этого?