Ошибка преобразования данных из Firebase в целое число

#android #firebase #firebase-realtime-database

#Android #firebase #firebase-база данных в реальном времени

Вопрос:

Я пытаюсь извлечь целое число с именем scoreBase из базы данных Firebase в реальном времени. Я хочу считывать данные из базы данных, а не прослушивать изменения, вот почему я использую mDatabase.addListenerForSingleValueEvent. Я не понимаю, как преобразовать его в целое число, и я получаю эту ошибку:

java.lang.ClassCastException: java.lang.Long не может быть преобразован в java.lang.Целое число в com.example.root.exercicis.Вход в систему $ 2 $ 1.Изменение данных (Signin.java:131) на com.google.firebase.database.Запрос $ 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.Сборщик событий $ 1.выполнить (com.google.firebase:firebase-database@@16.0.5:55 ) в android.os.Handler.handleCallback (Обработчик.java: 751) в android.os.Handler.DispatchMessage (обработчик.java:95) в android.os.Looper.loop (Looper.java:154) в android.app.ActivityThread.main (ActivityThread.java: 6119) в java.lang.reflect.Метод.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);
        }

        // ...
    }
});
}
  

Комментарии:

1. Пожалуйста, добавьте свою структуру базы данных.

Ответ №1:

Я нашел решение, заменяющее

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

для

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

Комментарии:

1. Это действительно правильный способ получить целочисленное значение из моментального снимка. Я обычно использую только Long в своем Java-коде для значений, которые поступают из Firebase, поскольку это лучшее отражение базового типа в базе данных.

Ответ №2:

Из документов DataSnapshot.GetValue(), GetValue() возвращает объект, который может быть преобразован только в логическое значение, строку, длинное значение, двойное значение, карту, список (не целое число). В строке

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

Вы приводите его непосредственно к int, что вызывает исключение приведения.
Сначала вам нужно преобразовать его в Long, а затем в int, например:

 int scoreBase = (int) ((long) dataSnapshot.getValue());
  

или вы также можете использовать :

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

Вы можете прочитать документацию здесь.

Ответ №3:

Прежде всего, проверьте, является ли объект null или нет.

Вы также можете попробовать.

 Integer.ValueOf(dataSnapShot.getValue());