Как получить правильный подтип из firebase android getValue ()

Привет всем, я не могу придумать лучшего примера, чтобы проиллюстрировать мою точку зрения, поэтому дайте мне знать, если в моем примере есть ошибки. Но, надеюсь, этот пример разъяснит мою точку зрения.

class A {
    String CATEGORY = "A";

    public String getCATEGORY() {
        return CATEGORY;
    }
}

class B extends A {
    String CATEGORY = "B";


    @Override
    public String getCATEGORY() {
        return CATEGORY;
    }
}


class C extends A {
    String CATEGORY = "C";

    @Override
    public String getCATEGORY() {
        return CATEGORY;
    }
}

public class MyClass {
    private List<A> array = Arrays.asList(new A(), new B(), new C());

    public MyClass() {}

}

Теперь, если я загружу MyClass в firebase, например, с помощью setValue, firebase покажет мне свойства классов A, B и C. Однако, когда я читаю данные из firebase и вызываю sth, например getValue (MyClass.class), List он возвращает мне все относятся к типу A, и подклассы не сохраняются. Есть ли обходной путь, позволяющий firebase сохранять загруженные типы классов?

0
0
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы используете сериализатор Firebase по умолчанию, он просто записывает все общедоступные свойства и поля в базу данных. Скажем, вы храните по одному экземпляру каждого класса, это будет:

-L1234567890: {
  cATEGORY: "A"
},
-L1234567891: {
  cATEGORY: "B"
},
-L1234567892: {
  cATEGORY: "C"
},

В базе данных недостаточно знаний для SDK, чтобы заново создать правильный подкласс. Хотя мы с вами видим, что значение cATEGORY соответствует имени класса, Firebase SDK не имеет таких сведений.

Однако нетрудно написать свой собственный десериализатор для этих данных, взяв DataSnapshot с указанными выше значениями и повторно установив правильный класс и значения.

Вы также можете сделать гибрид: определить тип класса напрямую, а затем указать Firebase, какой класс читать:

String cat = snapshot.child("cATEGORY").getValue(String.class)
Class clazz = "C".equals(cat) ? C.class : "B".equals(cat) ? B.class : A.clas;
A object = snapshot.getValue(clazz);

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