firebase: InstantiationException: не удается создать экземпляр абстрактного класса java.util.TimeZone

Я пытаюсь разобрать список EventPojo-классы из базы данных Firebase, как это:

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

Почему пожарная база пытается навязать TimeZone и не GregorianCalender?

1 ответ

Решение

База данных Firebase Realtime хранит только типы JSON. Нет возможности сериализовать / десериализовать GregorianCalendar (или же TimeZone) без написания собственного кода.

Мой типичный подход заключается в том, чтобы иметь свойство типа JSON (например, Long сохранить метку времени), а затем получить метод, который возвращает тип, с которым приложение работает (так что GregorianCalendar в твоем случае). Чтобы Firebase не пытался сериализовать GregorianCalendar метод, отметьте это как @Exclude (также см. Как игнорировать новые поля для объектной модели с 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(),

Другие вопросы по тегам