我正在尝试从实时Firebase数据库中提取一个名为scoreBase的整数。我想从数据库读取数据,而不是听更改,所以这就是为什么我使用mDatabase.addListenerForSingleValueEvent。我不明白如何将其转换为整数,但出现此错误:
java.lang.ClassCastException:无法将java.lang.Long强制转换为java.lang.Integer 在com.example.root.exercicis.Signin $ 2 $ 1.onDataChange(Signin.java:131) com.google.firebase.database.Query $ 1.onDataChange(com.google.firebase:firebase-database @@ 16.0.5:183) com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database @@ 16.0.5:75) com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database @@ 16.0.5:63) 在com.google.firebase.database.core.view.EventRaiser $ 1.run(com.google.firebase:firebase-database @@ 16.0.5:55) 在android.os.Handler.handleCallback(Handler.java:751) 在android.os.Handler.dispatchMessage(Handler.java:95) 在android.os.Looper.loop(Looper.java:154) 在android.app.ActivityThread.main(ActivityThread.java:6119) 在java.lang.reflect.Method.invoke(本机方法) 在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:886) 在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
这是代码:
public void onLogin(View view) {
email = userEditText.getText().toString();
password = passwordEditText.getText().toString();
mAuth.signInWithEmailAndPassword(email,password)
.addOnCompleteListener(this,new OnCompleteListener<AuthResult>() {
@Override
public void onComplete (@NonNull Task < AuthResult > task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
FirebaseUser user = mAuth.getCurrentUser();
mDatabase = FirebaseDatabase.getInstance().getReference().child("users").child(task.getResult().getUser().getUid()).child("score");
mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
int scoreBase = (int) dataSnapshot.getValue();
Toast.makeText(Signin.this, Integer.toString(scoreBase), Toast.LENGTH_SHORT).show();
sharedPreferences.edit().putInt("SuperScore", scoreBase).apply();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
updateUI(user);
} else {
// If sign in fails, display a message to the user.
Toast.makeText(Signin.this, "Authentication failed.", Toast.LENGTH_SHORT).show();
updateUI(null);
}
// ...
}
});
}
答案 0 :(得分:1)
我发现解决方案可以替代
package.json
为
int scoreBase = (int) dataSnapshot.getValue();
答案 1 :(得分:1)
从DataSnapShot.getValue()的文档中,getValue()返回的Object只能转换为Boolean,String,Long,Double,Map,List(非整数)。符合
int scoreBase = (int) dataSnapshot.getValue();
您直接将其强制转换为int,这会导致Casting Exception。 您首先需要将其转换为Long,然后转换为int:
int scoreBase = (int) ((long) dataSnapshot.getValue());
或者您也可以使用:
int scoreBase = (int) dataSnapshot.getValue(Integer.class);
您可以阅读文档here。
答案 2 :(得分:0)
首先检查对象是否为空。
您也可以尝试。
Integer.ValueOf(dataSnapShot.getValue());