Firebase: как игнорировать проверяемый тип полей для объектной модели? - PullRequest
0 голосов
/ 21 февраля 2020

Мое android приложение аварийно завершает работу при запуске из-за небольшой ошибки в моей серверной части, которая находится в базе данных Firebase. Документ в моей базе данных firestore имеет поле, в котором ожидается объект Image (id и url), но по какой-то причине он хранится в базе данных как long.

Я получаю эту ошибку:

 java.lang.RuntimeException: Could not deserialize object. Can't convert object of type java.lang.Long to type com..data.entity.gps.tracker.ImageEntity

Мой класс ImageEntity:

public class ImageEntity {
    private int id;
    private String image_id;


    public String getImage_id() {
        return image_id;
    }

    public void setImage_id(String image_id) {
        this.image_id = image_id;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}

Я не могу просто исключить объект ImageEntity для обложки, это неотъемлемая часть моего приложение, как я могу добавить шаг проверки, чтобы проверить, является ли объект обложки действительным и не длинным?

Вот где происходит cra sh:

public List<Model> mapList(QuerySnapshot querySnapshot) {
    List<Model> list = new ArrayList<>();
    for (QueryDocumentSnapshot queryDocumentSnapshot : querySnapshot) {
        Model model = map(queryDocumentSnapshot);
        long id = ((Release) model).getId();
        if (!addedReleasesIDs.contains(id)) {
            list.add(model);
            addedReleasesIDs.add(id);
        }
    }
    return list;
}

public Model map(QueryDocumentSnapshot queryDocumentSnapshot) {
    // Auto serialization
    Entity entity = queryDocumentSnapshot.toObject(getEntityClass()); // CRASH HERE
    return map(entity);
}

1 Ответ

1 голос
/ 21 февраля 2020

Если вам нужно взять под контроль десериализацию снимка документа, вы должны получить доступ к его полям как Map<String, Object>, используя getData () вместо использования внутреннего сопоставителя Firebase SDK.

Map<String, Object> data = (Map<String, Object>) queryDocumentSnapshot.getData();

Теперь вы можете get() отдельных полей по имени из карты data, проверять их типы и преобразовывать их в любой другой тип, который вы хотите использовать для объекта модели.

Это также быстрее с точки зрения производительности, чем использование toObject, потому что он не должен использовать Java отражение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...