3

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.

+0

Essayez 'isAppAuthorized = dataSnapshot.getValue (Long.class)' – Tarun

+0

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

+1

Long est une référence à un objet alors que long est une primitive. – Tarun

Répondre

1

Utilisation:

isAppAuthorized = dataSnapshot.getValue(Integer.class); 
+0

en référence au commentaire de Tarun, j'ai essayé cela aussi. Cela a également fonctionné (mais a donné une erreur NullException au début). Est-ce parce que int et long ne peuvent pas renvoyer une référence nulle par rapport à Integer et Long? Merci pour l'aide, je vais essayer de résoudre l'erreur NullException. – applejuice

+1

@applejuice dataSnapshot.getValue (Long.class); vous devez passer classe (Long est une classe) mais long n'est pas une classe –

+1

@applejuice vous pouvez obtenir null si app_authorized n'existe pas vérifier votre base de données de la console firebase –