Селектаблимажемодель:
public class SelectableImageModel {
@PropertyName("FILE_NAME")
public String fileName;
@PropertyName("DURATION")
public int duration;
@PropertyName("EXPIRATION_DATE")
public String expirationDate;
@PropertyName("FILE_NAME")
public String getFileName() {
return fileName;
}
@PropertyName("FILE_NAME")
public void setFileName(String fileName) {
this.fileName = fileName;
}
@PropertyName("DURATION")
public int getDuration() {
return duration;
}
@PropertyName("DURATION")
public void setDuration(int duration) {
this.duration = duration;
}
@PropertyName("EXPIRATION_DATE")
public String getExpirationDate() {
return expirationDate;
}
@PropertyName("EXPIRATION_DATE")
public void setExpirationDate(String expirationDate) {
this.expirationDate = expirationDate;
}
}
Код
if (documentSnapshot.get("IMAGES") != null) {
List<SelectableImageModel> imagesList = (List<SelectableImageModel>) documentSnapshot.get("IMAGES");
Log.w("ABC", "... " + documentSnapshot.get("IMAGES"));
Log.w("ABC", "... " + documentSnapshot.get("IMAGES").getClass());
Log.w("ABC", "... " + documentSnapshot.get("IMAGES").getClass().getName());
Log.w("ABC", imagesList == null ? "null" : "notnull");
Log.w("ABC", ". " + imagesList.size()); //Output is 3
Log.w("ABC", ". " + imagesList.get(0));
try {
Log.w("ABC", imagesList.get(0).getFileName().getClass().getName());
} catch (Exception e) {
Log.w("ABC", "... " + e); // Always print this exception -> java.lang.ClassCastException: java.util.HashMap cannot be cast to com.xxx.adminpanel.app.models.SelectableImageModel
}
}
Поле IMAGES
представляет собой массив, в котором каждый элемент представляет собой карту. Как видно из приведенного выше кода, я пытаюсь преобразовать этот массив в список. Однако я столкнулся с исключением. Что мне не хватает?
@DougStevenson Надеюсь, вы сможете предоставить решение в виде кода, чтобы точно продемонстрировать, что вы имеете в виду.
Предлагаю просмотреть документацию о том, как работать с данными, поступающими из снимков документов. Это довольно просто. Я также рекомендую обновить ваш вопрос, чтобы лучше понять, где вы застряли с этим.
Метод DocumentSnapshot#get(String field) возвращает объект типа Object. Таким образом, следующая строка кода определенно потерпит неудачу:
(List<SelectableImageModel>) documentSnapshot.get("IMAGES");
Потому что в Java вы не можете выполнить такое приведение. Однако, если вы попытаетесь выполнить такое приведение, вы, скорее всего, получите ClassCastException. Чтобы получить массив IMAGES
в виде List<SelectableImageModel>
, я рекомендую вам создать еще один класс, который выглядит так:
public class Document {
public List<SelectableImageModel> imagesList;
}
И чтобы прочитать документ, вы должны вместо этого использовать метод DocumentSnapshot#toObject(Class valueType). Итак, в коде это должно выглядеть так:
List<SelectableImageModel> imagesList = documentSnapshot.toObject(Document.class).imagesList;
Итак, сначала вам нужно преобразовать объект DocumentSnapshot
в объект типа Document
, а затем прочитать общедоступное поле imagesList
изнутри объекта. Для получения дополнительной информации я также рекомендую вам прочитать этот ресурс.
Это не удается:
(List<SelectableImageModel>) documentSnapshot.get("IMAGES");
Вы не можете напрямую передавать данные документа в пользовательский класс Java. Вы должны вручную заполнить класс, вытащив каждое поле из моментального снимка документа и поместив его в класс. Поля документа всегда будут только String, Long, Double, Timestamp, Boolean, DocumentReference, Map<Object>, List<Object>.