【问题标题】:Firebase: How to ignore validate type of fields for an object model?Firebase:如何忽略对象模型的验证类型字段?
【发布时间】:2020-02-21 16:06:04
【问题描述】:

我的 android 应用程序在启动时崩溃,因为我在 firebase 中的后端发生了一个小错误。我的 firestore 数据库中的一个文档有一个字段,其中需要一个 Image 对象(id 和 url),但由于某种原因,它在数据库中存储为 long。

我收到此错误:

 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;
    }
}

我不能只排除封面 ImageEntity 对象,它是我的应用程序不可或缺的一部分,如何添加验证步骤来检查封面对象是否为有效对象而不是长对象?

这是崩溃发生的地方:

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);
}

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案1】:

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

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

    有了这个,您现在可以从 data 映射中按名称 get() 各个字段,检查它们的类型,并将它们转换为您想要的模型对象的任何其他类型。

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

    【讨论】:

    • 谢谢你!我只是将其转换为正确的类型吗?
    • 如果你确定它会是什么,你可以投射它,但为了非常安全,你应该检查 null 并首先使用instanceof 以确保它确实是你所期望的。
    猜你喜欢
    • 2013-08-10
    • 2019-12-31
    • 2012-11-15
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    相关资源
    最近更新 更多