firebase: InstantiationException: не удается создать экземпляр абстрактного класса java.util.TimeZone - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь проанализировать список 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

Почему firebase пытается установить TimeZone, а не GregorianCalender?

1 Ответ

0 голосов
/ 15 декабря 2018

База данных 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().

...