简体   繁体   中英

Have crash when reading data from Firebase RealTime database

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)

Here is the image of the how my database looks在此处输入图像描述

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM