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()
,