首页 > 解决方案 > Firebase 中的多态性

问题描述

我在使用 Firebase 时遇到了一些问题。我的数据结构是这样的:

Class PoJo{
  int field
  String field
  PolyPojo field
}

Class PolyPojo {
  int typeForAll
}

Class PolyType1 {
  int field1
  String field2
}

Class PolyType2 {
  boolean field3
  long field4
}

我需要 PolyPojo 是可实例化的,如果代码中没有发生任何其他事情,PoJo 的默认构造函数会将 PolyPojo 实例化为 PolyPojo 字段。我遇到的问题是我正在检查 PolyType1 类是否被实例化并发送到 firebase。我检查了firebase,数据存储正确。当我尝试从我的 db ref 中读取数据时,如下所示:

ref.child("users").child(user.getUid()).get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (!task.isSuccessful()) {
            Log.e("firebase", "Error getting data", task.getException());
        }
        else {
            Log.d("firebase", String.valueOf(task.getResult().getValue()));
            PoJo pojo = task.getResult().getValue(PoJo.class);
            if (pojo != null) {
                this.pojo = pojo;
                onDataLoaded();
            }
        }
    }
});

除了 PolyPojo 字段之外,父类上的所有内容都很好并且工作正常,我遇到的问题是 PolyPojo 字段被键入为只是一个 PolyPojo,而不是正确的多态类 PolyType1。

有人知道我在做什么错吗?

对于更多上下文,所有类都正确(AFAIK)实现了可拆分和序列化/反序列化,从解构和重建活动按预期工作,但我不相信使用 getValue(Class.class) 可以解决这些功能。

标签: javaandroidfirebasefirebase-realtime-database

解决方案


Firebase 不会存储有关您传递给它的对象的任何类型信息。如果您希望PolyPojo从数据库中获取 a,则需要在调用中明确说明getValue

task.getResult().getValue(PolyPoJo.class)

由于 Firebase 不存储此类信息,这通常意味着您还需要自己存储类型信息 - 因此向数据库添加一个附加属性,表明数据是针对PolyPojo对象的。


推荐阅读