微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DatabaseException:反序列化时需要一个List,但是得到了一个类java.util.HashMap

如何解决DatabaseException:反序列化时需要一个List,但是得到了一个类java.util.HashMap

我正在为一个教育学院开发一个应用程序,下面的代码片段检索了一个Parent对象,该对象以前被推送到Firebase Realtime Database,然后链接到Student对象,然后再将该Student对象也推送到数据库

如果这是该特定父母的第一个学生(孩子),则该代码可以正常工作。 换句话说,此父对象具有其孩子的列表。如果此列表为空或为null,则代码可以正常工作..但是,如果要推送的Student是同一父级的第二个子级,这意味着检索到的Parent对象将包含子级列表,我得到此信息:

com.google.firebase.database.DatabaseException: Expected a List while deserializing,but got a class java.util.HashMap

以下是检索Parent对象的方法

private void getCorrespondingParent(){
    DatabaseReference correspondingParentReference = FirebaseDatabase.getInstance().getReference()
            .child("parents").child(mUserPhone);
    correspondingParentReference.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            mParent = snapshot.getValue(Parent.class);
            // null out the children field because the Parent object will be saved in the Student object
            // this avoids having a parent with children list that each Student in it has a parent object that
            // has a list of students...
            mParent.setChildren(null);
        }
        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            Log.w(LOG_TAG,"loadPost:onCancelled",error.toException());
        }
    });
}

数据库位于获取dataSnapshot值的行中: mParent = snapshot.getValue(Parent.class);

这是数据库中的父节点: DatabaseReference

这是Parent对象的POJO类:

public class Parent {
private int accType;
private String name;
private String uid;
private String phone;
private String whatsappPhone;
private String kNow;
private List<Student> children;

public Parent() {}

public Parent(String name,String uid,String phone,String whatsappPhone,String kNow) {
    this.accType = 3;
    this.name = name;
    this.uid = uid;
    this.phone = phone;
    this.whatsappPhone = whatsappPhone;
    this.kNow = kNow;
}

public int getAccType() {
    return accType;
}

public void setAccType(int accType) {
    this.accType = accType;
}

public String getName() {
    return name;
}

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

public String getUid() {
    return uid;
}

public void setUid(String uid) {
    this.uid = uid;
}

public String getPhone() {
    return phone;
}

public void setPhone(String phone) {
    this.phone = phone;
}

public String getWhatsappPhone() {
    return whatsappPhone;
}

public void setWhatsappPhone(String whatsappPhone) {
    this.whatsappPhone = whatsappPhone;
}

public String getKNow() {
    return kNow;
}

public void setKNow(String kNow) {
    this.kNow = kNow;
}

public List<Student> getChildren() {
    return children;
}

public void setChildren(List<Student> children) {
    this.children = children;
}

}

解决方法

好的,我发现了问题所在。

Parent object node

所示

我使用学生姓名作为Student对象的键,并且还使用List将父级的子级存储在Parent对象中。事实证明,如果您使用列表,则不能为此使用自定义键,列表项键仅是索引,并且不能更改。我切换到Settings > Build,Excution,Deployment > Console而不是Map<String,Student> children,现在可以正常使用了。

推送代码无需更改:

List<Student> children

mNewStudent是一个Student对象,其中包含新添加的学生数据。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?