Firebase:如何忽略对象模型的验证字段类型?

时间:2020-02-21 16:06:04

标签: android firebase google-cloud-firestore

我的android应用程序在启动时崩溃,因为后端的小错误(位于Firebase中)。我的Firestore数据库中的文档有一个字段,其中应包含Image对象(ID和URL),但由于某种原因,它在数据库中存储的时间很长。

我收到此错误:

 java.lang.RuntimeException: Could not deserialize object. Can't convert object of type java.lang.Long to type com..data.entity.gps.tracker.ImageEntity

我的ImageEntity类:

public class ImageEntity {
    private int id;
    private String image_id;


    public String getImage_id() {
        return image_id;
    }

    public void setImage_id(String image_id) {
        this.image_id = image_id;
    }

    public int getId() {
        return id;
    }

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

我不能仅仅排除Cover ImageEntity对象,它是我应用程序的组成部分,如何添加验证步骤以检查Cover对象是否是有效对象而不是长对象?

这是崩溃发生的地方:

public List<Model> mapList(QuerySnapshot querySnapshot) {
    List<Model> list = new ArrayList<>();
    for (QueryDocumentSnapshot queryDocumentSnapshot : querySnapshot) {
        Model model = map(queryDocumentSnapshot);
        long id = ((Release) model).getId();
        if (!addedReleasesIDs.contains(id)) {
            list.add(model);
            addedReleasesIDs.add(id);
        }
    }
    return list;
}

public Model map(QueryDocumentSnapshot queryDocumentSnapshot) {
    // Auto serialization
    Entity entity = queryDocumentSnapshot.toObject(getEntityClass()); // CRASH HERE
    return map(entity);
}

1 个答案:

答案 0 :(得分:1)

如果您需要控制文档快照的反序列化,则应使用getData()Map<String, Object>的形式访问其字段,而不是使用Firebase SDK内部映射器。

Map<String, Object> data = (Map<String, Object>) queryDocumentSnapshot.getData();

现在,您可以按名称get()data映射中<partial name="_AlarmListPartial" /> ,检查其类型,并将其转换为模型对象所需的其他任何类型。

在性能方面也比使用toObject更快,因为它不必使用Java反射。