Java.lang.ClassCastException: java.util.HashMap не может быть приведен к пользовательскому классу данных

Я загружаю свой объект класса данных в Firestore, он загружается нормально, когда я пытаюсь загрузить его из другого действия, происходит java.lang.ClassCastException. Мне нужно, чтобы объект класса Cart в AddToCart.java был сохранен в Firestore (успех) и возвращен в Cart.java (сбой). ПОЖАЛУЙСТА ПОМОГИ!!!!!

Вот как я помещаю данные в Firestore:

 private void updateFirestore() {

    Map cartList = new HashMap<String,CartModel>();

    //I put data into the map

    FirebaseFirestore firestoreRef = FirebaseFirestore.getInstance();
    firestoreRef.collection(colloctionKeyTitle)
                  .document(currentSelectedModel.getUserId()).set(cartList)

Здесь карта с одним значением ключа загружается в firestore: Java.lang.ClassCastException: java.util.HashMap не может быть приведен к пользовательскому классу данных

ТЕПЕРЬ, вот код, чтобы вернуть эту карту.

 FirebaseFirestore firestoreRef = FirebaseFirestore.getInstance();

    Task<DocumentSnapshot> documentSnapshot = firestoreRef.collection(COLLECTION_ID).document(userId).get()
            .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                @Override
                public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                    cartList = task.getResult().getData();
                    if (cartList != null) {
                        if (!cartList.isEmpty()) {
                            for (String key : cartList.keySet()) {
                                Object object = cartList.get(key);// In object variable I see my data when debug, but app crashes on next line.
                                Constant.listCartItems.add((CartModel) object); //this is the line where error occur.
                            }
                        }

                    }
                }
            });

Вот мой CartModel.java (класс данных)

public class CartModel {
private String productTitle,productPrice, featuredImagePath, quantity;

public CartModel(String productTitle, String productPrice, String featuredImagePath,String quantity) {
    this.productTitle = productTitle;
    this.productPrice = productPrice;
    this.quantity=quantity;
    this.featuredImagePath = featuredImagePath;
}

public CartModel(String productTitle, String productPrice, String featuredImagePath) {
    this.productTitle = productTitle;
    this.productPrice = productPrice;
    this.featuredImagePath = featuredImagePath;
}

public CartModel() {

}


public String getQuantity() {
    return quantity;
}

public void setQuantity(String quantity) {
    this.quantity = quantity;
}

public String getProductTitle() {
    return productTitle;
}

public void setProductTitle(String productTitle) {
    this.productTitle = productTitle;
}

public String getProductPrice() {
    return productPrice;
}

public void setProductPrice(String productPrice) {
    this.productPrice = productPrice;
}

public String getFeaturedImagePath() {
    return featuredImagePath;
}

public void setFeaturedImagePath(String featuredImagePath) {
    this.featuredImagePath = featuredImagePath;
}

}

Java.lang.ClassCastException: java.util.HashMap не может быть приведен к пользовательскому классу данных

Какой тип объекта дает cartList.get(key)?

Evgeni Enchev 18.02.2019 16:48

Пожалуйста, добавьте содержание вашего класса CartModel и, пожалуйста, ответьте @AlexMamo

Alex Mamo 18.02.2019 17:16

добавлен класс данных

Abdul Rahman Shamair 18.02.2019 18:05

@AlexMamo, пожалуйста, посмотрите это.

Abdul Rahman Shamair 18.02.2019 18:20

@AlexMamo Пожалуйста, посмотрите это

Abdul Rahman Shamair 18.02.2019 18:21

Еще один вопрос. Внутри carItem 0 вы хотите хранить один или несколько предметов? Это то, чего вы хотели в первую очередь, чтобы эти поля были под carItem 0?

Alex Mamo 18.02.2019 18:27

Я должен поддерживать корзину для конкретного пользователя, поэтому да, против одного идентификатора документа будет много объектов CartModel, поэтому да, когда вы попытаетесь получить их из firestore, будет много cartItem, да, это то, что я хотел, подождите, @AlexMamo я покажу ты.

Abdul Rahman Shamair 18.02.2019 18:50

Хорошо, дайте мне пример.

Alex Mamo 18.02.2019 18:52

@AlexMamo смотри сейчас...……..

Abdul Rahman Shamair 18.02.2019 19:04

Я прикрепил скриншот экрана отладки..... и обновил скриншот firestore.

Abdul Rahman Shamair 18.02.2019 19:06

Давайте продолжить обсуждение в чате.

Abdul Rahman Shamair 18.02.2019 19:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
11
3 654
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Я думаю, что проблема в объекте Constant. Существует несоответствие между Constant.listCartItems и объектом, который вы поместили на карту.

Ошибка возникает, когда я пытаюсь привести объект к классу CartModel.

Abdul Rahman Shamair 18.02.2019 18:07

У вас есть два пути решения вашей проблемы:

Решение первое

приведите свой объект к правильному:

Object object = (MyObject) cartList.get(key);
                 ^^^^^^^^

Решение второе

Вы должны установить тип ключа и значения:

Map<Key, Value> cartList = new HashMap<String,CartModel>(); 
    ^^^   ^^^^ 

1> Это избыточное приведение

Abdul Rahman Shamair 18.02.2019 18:13

2> Я не контролирую тип cartList, он поступает с сервера

Abdul Rahman Shamair 18.02.2019 18:13

Map<String,Object> — это параметры, значения которых поступают на сервер.

Abdul Rahman Shamair 18.02.2019 18:14
Ответ принят как подходящий

Теперь я вижу в вашей структуре базы данных, что вы содержите более одного объекта типа CartModel внутри этого документа. Чтобы решить эту проблему, получите данные в виде Map, как в следующей строке кода:

Map<String, Object> map = document.getData();

Перебрать map и получить из него все CartModel объекты. Вот и все.

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