问题
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:"vikas@gmail.com",
}
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
回答1:
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.
来源:https://stackoverflow.com/questions/44844121/firebase-database-exception-while-retrieving-data-from-firebase-database