将DataSnapshot从Firebase投射到Integer失败

时间:2019-03-07 11:19:24

标签: 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(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);
        }

        // ...
    }
});
}

3 个答案:

答案 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());