0

I have a Firebase Database as shown below. I am trying to retrieve this episode data but always getting error

users:
{
 Fcm_id: "c68y2j3bwis:APA91bFABxC6W5FmYVCOSmgJiB_-UEqnrmQ...",
 Name: "Vikas Kumar",
 episodes:{
 0: "-Kno0IYdlSjjfFsXkGQ7",
 1: "-Kno0IYdlSjjfFsXkGQ8"
 },
 gender:Male,
 age:14,
 email:"[email protected]",
}

this is the user POJO class in which I am creating a HashMap

public class User implements Serializable{

    private String Name;
    private String email;
    private String gender;
    private String Fcm_id;
    private String id;
    private int age;
    private String image;

    private ArrayList<Map<String,Object>> episodes;



public User()
{

}

public ArrayList<Map<String, Object>> getEpisodes() {
    return episodes;
}

public void setEpisodes(ArrayList<Map<String, Object>> episodes) {
    this.episodes = episodes;
}


    public String getImage() {
        return image;
    }

    public void setImage(String image) {
        this.image = image;
    }

    public String getFcm_id() {
        return Fcm_id;
    }

    public void setFcm_id(String Fcm_id) {
        this.Fcm_id = Fcm_id;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return Name;
    }

    public void setName(String Name) {
        this.Name = Name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

}

ListPatients.java Class where I have written code to retrieve the data from the database

 firebasePathMain.child("users").child(auth.getCurrentUser().getUid()).child("episodes").addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

                String episodeId = dataSnapshot.getValue().toString();
                Log.d(TAG,episodeId);

                firebasePathMain.child("episodes").child(episodeId).child("Participants").child("User_id").addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        final String UserId = dataSnapshot.getValue().toString();
                        Log.d(TAG,UserId);

                        firebasePathMain.child("users").child(UserId).addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                User user = dataSnapshot.getValue(User.class);
                                user.setId(UserId);

                                Log.d(TAG,user.getName());
                                listPatient.add(user);
                                adapterPatients.notifyDataSetChanged();

                               // adapterPatients.refillAdapter(user);
                              //  listUpdate.add(0, user.getId());

                            }

                            @Override
                            public void onCancelled(DatabaseError databaseError) {

                            }
                        });

                        Listpatients.add(UserId);
                        Log.d(TAG,Listpatients.toString());

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

but when I trying to retrieve the data it is this error

Expected a Map while deserializing, but got a class java.util.ArrayList

2
  • I have more easy solution than this which is given below just made the Map in the Arraylist Commented Jun 30, 2017 at 13:14
  • you can refer to this answer of mine. stackoverflow.com/questions/55016979/… Almost similar issue. Commented Sep 26, 2019 at 10:03

1 Answer 1

0

You need to use Map<String, Object>, not a HashMap<Integer, String>.

Please use this code:

private Map<String, Object> episodes;

public HashMap<String, Object> getEpisodes() {
    return episodes;
}

public void setEpisodes(HashMap<String, Object> episodes) {
    this.episodes = episodes;

}

To query your database please use this code:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference episodesRef = rootRef..child("users").child(auth.getCurrentUser().getUid()).child("episodes");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String key = ds.getKey();
            String value = ds.getValue(String.class)
            Log.d("TAG", "key= " + key + " -> value: " + value);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
episodesRef.addListenerForSingleValueEvent(eventListener);

And the output will be:

 key: 0 -> value: -Kno0IYdlSjjfFsXkGQ7
 key: 1 -> value: -Kno0IYdlSjjfFsXkGQ8

It will work for sure.

Sign up to request clarification or add additional context in comments.

13 Comments

Expected a Map while deserializing, but got a class java.util.ArrayList
You need to add implements Serializable to you POJO class and your problem will be solved.
Ok, than you need to change other fieds that are declared as an ArrayList with a Map. Remember, every entry in a Firebase database is structured as pair, of key and value.
It's incomplete. Share the complete version with all fields
In order to make Firebase work, you need to add to your pojo, the no argument constructor -> User() {}
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.