Android 将dataSnapshot从Firebase转换为整数失败

Android 将dataSnapshot从Firebase转换为整数失败,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我试图从实时Firebase数据库中提取一个名为scoreBase的整数。我想从数据库中读取数据,而不是侦听更改,这就是为什么我要使用mDatabase.addListenerForSingleValueEvent。但我不知道如何将其转换为整数,因此出现以下错误: java.lang.ClassCastException:java.lang.Long不能转换为java.lang.Integer 在com.example.root.exercicis.Signin$2$1.onDataChange

我试图从实时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数据库@@16.0.5:183) 位于com.google.firebase.database.core.ValueEventRegistration.firevent(com.google.firebase:firebase数据库@@16.0.5:75) 位于com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase数据库@@16.0.5:63) 位于com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase数据库@@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);
        }

        // ...
    }
});
}
public void onLogin(视图){
email=userEditText.getText().toString();
password=passwordEditText.getText().toString();
mAuth.使用电子邮件和密码登录(电子邮件,密码)
.addOnCompleteListener(这是新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull TaskTask){
if(task.issusccessful()){
//登录成功,使用登录用户的信息更新UI
FirebaseUser=mAuth.getCurrentUser();
mDatabase=FirebaseDatabase.getInstance().getReference().child(“用户”).child(task.getResult().getUser().getUid()).child(“分数”);
mDatabase.addListenerForSingleValueEvent(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot DataSnapshot){
int scoreBase=(int)dataSnapshot.getValue();
Toast.makeText(Signin.this,Integer.toString(scoreBase),Toast.LENGTH_SHORT.show();
sharedReferences.edit().putInt(“超级核心”,scoreBase).apply();
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
updateUI(用户);
}否则{
//如果登录失败,则向用户显示消息。
Toast.makeText(Signin.this,“身份验证失败”,Toast.LENGTH_SHORT.show();
updateUI(null);
}
// ...
}
});
}

我发现解决方案正在替换

int scoreBase = (int) dataSnapshot.getValue();
为了


我发现这个解决方案取代了

int scoreBase = (int) dataSnapshot.getValue();
为了


首先检查对象是否为空

你也可以试试

Integer.ValueOf(dataSnapShot.getValue());

首先检查对象是否为空

你也可以试试

Integer.ValueOf(dataSnapShot.getValue());
从的文档中,getValue()返回对象,该对象只能转换为布尔、字符串、Long、Double、Map、List(非整数)。一致

您直接将其强制转换为int,这会导致强制转换异常。 首先需要将其转换为Long,然后再转换为int,如:

int scoreBase = (int) ((long) dataSnapshot.getValue());
或者,您也可以使用:

int scoreBase = (int) dataSnapshot.getValue(Integer.class);
您可以阅读文档。

来自的文档,getValue()返回对象只能转换为布尔、字符串、长、双精度、映射、列表(非整数)。一致

您直接将其强制转换为int,这会导致强制转换异常。 首先需要将其转换为Long,然后再转换为int,如:

int scoreBase = (int) ((long) dataSnapshot.getValue());
或者,您也可以使用:

int scoreBase = (int) dataSnapshot.getValue(Integer.class);

您可以阅读文档。

请添加数据库结构。请添加数据库结构。这确实是从快照中获取整数值的正确方法。我通常坚持在Java代码中只使用
Long
来表示来自Firebase的值,因为这是数据库中底层类型的最佳反映。这确实是从快照中获取整数值的正确方法。我通常只在Java代码中使用
Long
来表示来自Firebase的值,因为这是数据库中底层类型的最佳反映。