java - 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) 可以解决这些功能。
解决方案
Firebase 不会存储有关您传递给它的对象的任何类型信息。如果您希望PolyPojo
从数据库中获取 a,则需要在调用中明确说明getValue
:
task.getResult().getValue(PolyPoJo.class)
由于 Firebase 不存储此类信息,这通常意味着您还需要自己存储类型信息 - 因此向数据库添加一个附加属性,表明数据是针对PolyPojo
对象的。
推荐阅读
- python - Django 在外键情况下按查询排序
- c# - 旋转图像并仅在图像内部裁剪:UWP
- swift - DatePicker 禁用星期日 + 开放时间
- java - 使用java建立与sql sql server的连接
- auth0 - Auth0:如何在规则中使用用户配置文件?
- php - 通过 API 向 Google 日历活动会议添加直播
- google-apps-script - 已发布的带有脚本的 Google 工作表无法正常工作
- awk - 使用awk在特定步骤中更改特定列中每个字段的值?
- python - 向字典中的某些键添加值?
- python - 嵌套 for 循环。满足条件时保存变量