火力地堡实时数据库的长值始终返回0,即使它不是
我一直在试图寻找了一段时间的解决方案,但无济于事。我显然不是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,无论什么样的价值,我把到数据库中,从而使我的授权没用的第二层。
我希望有人能够帮助我,这是我已经尝试了很多东西,我仍然无法理解问题的根源。
用途:
isAppAuthorized = dataSnapshot.getValue(Integer.class);
关于塔伦的评论,我也试过这个。它也起作用(但首先发生了NullException错误)。这是因为与整数和长整型相比,int和long不能返回空引用吗? 感谢您的帮助,我会尽力解决NullException错误。 – applejuice
@applejuice dataSnapshot.getValue(Long.class);您需要传递类(Long是类),但long不是类 –
@applejuice如果app_authorized不存在,则可以获取null从Firebase控制台检查数据库 –
尝试'isAppAuthorized = dataSnapshot.getValue(Long.class);' – Tarun
这工作了之后,我改变了这两个变量的声明和long.class龙与资本L(它返回尽管NullException错误)。为什么我必须使用Long而不是long? – applejuice
龙是一个对象的引用,而长为原始。 – Tarun