Получение ArrayList пользовательских объектов в firebase

Как бы вы собирались хранить и извлекать 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

Ваша помощь очень ценится

Я думаю, что эта статья, Как сопоставить массив объектов из Cloud Firestore со списком объектов?, поможет, верно?

Alex Mamo 06.04.2022 08:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

List<Map<String, Object> testList =
   (List<Map<String, Object>>) task.getResult().get("qrCodes");

На самом деле вы должны знать, что Firestore внутренне сопоставляет все с одним из этих основных типов: Map, List, String, Integer/Long, Boolean, null. Вы должны ожидать, что получите только эти типы, и вам, вероятно, также следует проверить типы instanceof, прежде чем что-либо приводить, чтобы убедиться, что вы никогда не сделаете неправильное приведение во время выполнения.

Спасибо за помощь Дуг! Это решение, которое я в итоге реализовал!

austin 06.04.2022 01:55

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