1

我尝试EventPojo从这样的 firebase 数据库中解析 -classes 列表:

GenericTypeIndicator<HashMap<String, EventPojo>> tEvents = new GenericTypeIndicator<HashMap<String, EventPojo>>() {};
HashMap<String, EventPojo> events = dataSnapshot.child(getString(R.string.eventsNodeName)).getValue(tEvents);

EventPojo我有一个GregorianCalender

public class EventPojo implements Comparable<EventPojo>{

    GregorianCalendar date;
...

当我尝试从数据库中获取 HashMap 时,我得到一个InstantiationException

java.lang.RuntimeException: java.lang.InstantiationException: Can't instantiate abstract class java.util.TimeZone

为什么firebase试图建立TimeZone而不是GregorianCalender

4

1 回答 1

1

Firebase 实时数据库仅存储 JSON 类型。如果不编写自定义代码,就无法序列化/反序列化 a GregorianCalendar(or )。TimeZone

我的典型方法是拥有一个 JSON 类型的属性(例如,Long用于存储时间戳的 a),然后拥有一个返回应用程序使用的类型的 getter(GregorianCalendar在您的情况下是 a)。为确保 Firebase 不会尝试序列化该GregorianCalendar方法,请将其标记为@Exclude(另请参阅:How to ignore new fields for an object model with Firebase 1.0.2,其中的一些示例)。

所以:

public class EventPojo implements Comparable<EventPojo>{
    public Long timestamp

    @Exclude
    public GregorianCalendar getDate() {
      ...
    }
    @Exclude
    public void getDate(GregorianCalendar date) {
      ...
    }

    ...

有了这个,Firebase 将看到该timestamp字段并从中读取并将其写入数据库,而您的代码仅与getDate()和进行交互setDate()

于 2018-12-15T15:03:42.140 回答