Как бы вы собирались хранить и извлекать ArrayList пользовательских объектов в firebase? В моем приложении для Android я храню и извлекаю массив следующим образом
Хранилище:
ArrayList<GameQRCode> qrCodes = new ArrayList<>();
qrCodes.add(new GameQRCode("name1", "value1"));
qrCodes.add(new GameQRCode("name2", "value2"));
qrCodes.add(new GameQRCode("name3", "value3"));
User user = new User("myUsername");
user.setQrCodes(qrCodes);
db.collection("users").document("myUsername").set(user);
Поиск:
db.collection("users").document("myUsername").get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
ArrayList<GameQRCode> testList = (ArrayList<GameQRCode>) task.getResult().get("qrCodes");
}
});
Однако, когда я пытаюсь использовать полученный ArrayList, я получаю сообщение об ошибке, подобное следующему...
GameQRCode qrCode = qrCodes.get(position);
java.util.HashMap cannot be cast to com.example.qracutie.GameQRCode
Ваша помощь очень ценится
Firestore не запоминает тип пользовательского объекта, который вы использовали в универсальном типе вашей коллекции, поэтому вы не можете просто привести его так, как вы его вставили, после того, как вернете документ. Сообщение об ошибке сообщает вам, что оно хранит данные в виде карты, а не вашего пользовательского типа объекта. Вы будете нести ответственность за то, чтобы иметь дело с этой картой напрямую, извлекать из нее значения и отображать их обратно в ваш пользовательский объект. Это означает, что вы, вероятно, должны извлекать данные следующим образом:
List<Map<String, Object> testList =
(List<Map<String, Object>>) task.getResult().get("qrCodes");
На самом деле вы должны знать, что Firestore внутренне сопоставляет все с одним из этих основных типов: Map, List, String, Integer/Long, Boolean, null. Вы должны ожидать, что получите только эти типы, и вам, вероятно, также следует проверить типы instanceof
, прежде чем что-либо приводить, чтобы убедиться, что вы никогда не сделаете неправильное приведение во время выполнения.
Спасибо за помощь Дуг! Это решение, которое я в итоге реализовал!
Я думаю, что эта статья, Как сопоставить массив объектов из Cloud Firestore со списком объектов?, поможет, верно?