#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());