J'ai essayé de trouver une solution pendant un certain temps, mais en vain. Je ne suis clairement pas un expert de Firebase et j'apprends toujours à coder.Les valeurs longues de la base de données Firebase Realtime retournent toujours 0 même si ce n'est pas
Je suis en train de créer un système de connexion où, en plus du système de vérification de courrier électronique fourni par Firebase, il y a une autre couche d'authentification que je dois manuellement faire moi-même. Ainsi, pour y parvenir, j'ai introduit Firebase Realtime Database dans mon projet. Voici un extrait du fichier JSON dans la base de données.
{
"users" : {
"abfkbnqeiurbnafjbnaojn" : {
"app_authorized" : 1,
"email" : "[email protected]",
"full_name" : "Test Sample",
"user_id" : "abfkbnqeiurbnafjbnaojn"
}
}
}
Comme vous pouvez le voir à partir du fichier JSON, la paire app_authorized clé-valeur régira si l'utilisateur peut souscrire ou non (0 signifie que l'utilisateur ne peut pas tout en 1 signifie que l'utilisateur est admissible à signer -dans). J'utilise l'UID de l'utilisateur à partir de la connexion Firebase avec le système de messagerie et de mot de passe pour le parent pour toutes les paires valeur/clé. Je suis également conscient que le type de valeur pour app_authorized est long.
Voici le code que j'ai utilisé dans mon SignInActivity.
long isAppAuthorized;
//some codes here
private void init() {
btnSignIn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d(TAG, "onClick: attempting to log in");
String email = emailEditText.getText().toString();
String password = passwordEditText.getText().toString();
//validates respective EditTexts
if (TextUtils.isEmpty(email)) {
emailEditText.setError("Please fill in your e-mail address!");
}
else if (TextUtils.isEmpty(password)) {
passwordEditText.setError("Please fill in your password!");
} else {
progressDialog.show();
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(SignInActivity.this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
Log.d(TAG, "signInWithEmail:onComplete:" + task.isSuccessful());
FirebaseUser user = mAuth.getCurrentUser();
firebaseDatabase = FirebaseDatabase.getInstance();
userID = user.getUid();
final DatabaseReference myRef = firebaseDatabase.getReference("users/" + userID + "/app_authorized");
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//gets value of isAppAuthorized
isAppAuthorized = dataSnapshot.getValue(long.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
// If sign in fails, display a message to the user. If sign in succeeds
// the auth state listener will be notified and logic to handle the
// signed in user can be handled in the listener.
if (!task.isSuccessful()) {
Log.w(TAG, "signInWithEmail:failed", task.getException());
Toast.makeText(SignInActivity.this, R.string.auth_failed,
Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
} else {
try {
//this is the part where I check for both isEmailVerified and isAppAuthorized
if(user.isEmailVerified() && isAppAuthorized == 1) {
Log.d(TAG, "onComplete: success. e-mail is verified " + user.isEmailVerified() + " userIsAuthorized: " + isAppAuthorized);
Intent intent = new Intent(SignInActivity.this, HomeActivity.class);
startActivity(intent);
} else {
Log.d(TAG, "onComplete: failed: isEmailVerified: " + user.isEmailVerified() + " userIsAuthorized: " + isAppAuthorized);
progressDialog.dismiss();
mAuth.signOut();
Intent intent = new Intent(SignInActivity.this, MainActivity.class);
startActivity(intent);
}
} catch(NullPointerException e) {
Log.e(TAG, "onComplete: NullPointerException: " + e.getMessage());
}
}
// ...
}
});
}
}
});
}
Le problème que je rencontrais est que la isAppAuthorized longue retourne toujours 0 quelle que soit la valeur que je mets dans la base de données, ainsi, ce qui rend ma seconde couche d'autorisation inutile.
J'espère que quelqu'un est capable de m'aider avec cela car j'ai essayé beaucoup de choses et suis toujours incapable de comprendre la source du problème.
Essayez 'isAppAuthorized = dataSnapshot.getValue (Long.class)' – Tarun
Cela a fonctionné après avoir changé à la fois la déclaration variable et long.class à Long avec le L majuscule (il est revenu une erreur NullException si). Y at-il une raison pour laquelle je dois utiliser Long au lieu de long? – applejuice
Long est une référence à un objet alors que long est une primitive. – Tarun