3

我一直在试图寻找了一段时间的解决方案,但无济于事。我显然不是Firebase专家,我仍然在学习如何编写代码。火力地堡实时数据库的长值始终返回0,即使它不是

我目前正在创建一个登录系统,其中,上电子邮件验证系统,该系统提供了火力地堡的顶部,有一个认证的另一层我手动必须做我自己。因此,为了实现这一点,我将Firebase实时数据库引入了我的项目。这是数据库中JSON文件的一个片段。

{ 
"users" : { 
    "abfkbnqeiurbnafjbnaojn" : { 
    "app_authorized" : 1, 
    "email" : "[email protected]", 
    "full_name" : "Test Sample", 
    "user_id" : "abfkbnqeiurbnafjbnaojn" 
    } 
} 
} 

正如可以从JSON文件看到,app_authorized键值对将支配用户是否可以登录与否(0意味着用户没有资格而1意味着用户有资格签署-在)。我使用从火力地堡的登录用户的UID与电子邮件和密码系统父所有键 - 值对。我也知道app_authorized的值类型很长。

下面是我在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()); 

             } 
            } 

            // ... 
           } 
          }); 
       } 
      } 
     }); 

    } 

,我遇到的问题是,isAppAuthorized长总是返回0,无论什么样的价值,我把到数据库中,从而使我的授权没用的第二层。

我希望有人能够帮助我,这是我已经尝试了很多东西,我仍然无法理解问题的根源。

+0

尝试'isAppAuthorized = dataSnapshot.getValue(Long.class);' – Tarun

+0

这工作了之后,我改变了这两个变量的声明和long.class龙与资本L(它返回尽管NullException错误)。为什么我必须使用Long而不是long? – applejuice

+1

龙是一个对象的引用,而长为原始。 – Tarun

回答

1

用途:

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

关于塔伦的评论,我也试过这个。它也起作用(但首先发生了NullException错误)。这是因为与整数和长整型相比,int和long不能返回空引用吗? 感谢您的帮助,我会尽力解决NullException错误。 – applejuice

+1

@applejuice dataSnapshot.getValue(Long.class);您需要传递类(Long是类),但long不是类 –

+1

@applejuice如果app_authorized不存在,则可以获取null从Firebase控制台检查数据库 –