I have crash when reading data from database.
I have some feature that adding movie to wishlist.
public void addMovieToWishList{
User.getInstance().getMoviesWishList().add(moviesResult);
mDataBaseHelper.addMovieToWishList(moviesResult);
}
public void addMovieToWishList(MoviesResult moviesResult){
user.child(mAuth.getCurrentUser().getUid())
.child("moviesWishList")
.child(String.valueOf(moviesResult.getId()))
.setValue(moviesResult)
.addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
mDatabaseHelperListener.onSuccess();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
mDatabaseHelperListener.onFailed(e.getMessage());
}
});
}
After I added movie to wish list, and reopening the app, I'm calling getUserDetails() method that should receive the the all user data.
public void getUserDetails() {
user.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (mAuth.getCurrentUser() != null) {
User.setInstance(snapshot.child(mAuth.getCurrentUser().getUid())
.getValue(User.class));
iDataReceiverListener.onSuccess();
}
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
iDataReceiverListener.onFailed(error.getMessage());
}
});
}
My user model class:
public class User {
private static User instance = null;
private static UserModel userModel;
private ArrayList<MoviesResult> moviesWishList = new ArrayList<>();
private ArrayList<UserModel> userFollowers = new ArrayList<>();
private ArrayList<UserModel> userFriends = new ArrayList<>();
private User() {
}
public static User getInstance() {
if (instance == null) {
instance = new User();
userModel = new UserModel();
}
return instance;
}
public UserModel getUserModel() {
return userModel;
}
public void setUserModel(UserModel userModel) {
User.userModel = userModel;
}
public static void setInstance(User instance) {
User.instance = instance;
}
public ArrayList<MoviesResult> getMoviesWishList() {
return moviesWishList;
}
public ArrayList<UserModel> getUserFollowers() {
return userFollowers;
}
public void setUserFollowers(ArrayList<UserModel> userFollowers) {
this.userFollowers = userFollowers;
}
public ArrayList<UserModel> getUserFriends() {
return userFriends;
}
public void setUserFriends(ArrayList<UserModel> userFriends) {
this.userFriends = userFriends;
}
}
The app is crashes with log:
2020-07-17 18:40:48.454 10600-10600/com.eag.moviearea E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.eag.moviearea, PID: 10600
com.google.firebase.database.DatabaseException: Expected a List while deserializing, but got a class java.util.HashMap
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToParameterizedType(CustomClassMapper.java:250)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToType(CustomClassMapper.java:176)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.access$100(CustomClassMapper.java:47)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:603)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(CustomClassMapper.java:562)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:432)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:231)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:79)
at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)
at com.eag.moviearea.services.AuthHelper$5.onDataChange(AuthHelper.java:110)
at com.google.firebase.database.Query$1.onDataChange(Query.java:179)
at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)
at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7356)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)
Ohh sory I fixed it with next solution: I converted the ArrayList in user model class to hashmap.
private HashMap<String, MoviesResult> moviesWishList = new HashMap<>();
And when I added the movie:
User.getInstance().getMoviesWishList().put(String.valueOf(moviesResult.getId()), moviesResult);
mDataBaseHelper.addMovieToWishList(moviesResult);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.