Анализ Android SDK: ClassCastException, когда LocalDatastore активирован и список сообщений подкласса загружается с сервера

Предыстория: я экспериментирую с приложением для обмена сообщениями.

Описание проблемы: обычно Codesnipped 2 работает как шарм и загружает данные с сервера. Но при активации LocalDatastore с Codesnipped 1 ошибка

java.lang.ClassCastException: com.parse.ParseObject не может быть приведен к at.test.activity.Message

возникает. Сообщение является подклассом ParseObject.

При просмотре Отладчиком строки, в которой возникает ошибка, видно, что список, который передается функции done, содержит только один объект типа «Сообщение» в первой позиции, а все остальные элементы имеют тип «ParseObject». " (-> Скриншот: Вывод отладчика при активации локального хранилища данных) . Без активированного локального хранилища данных каждый элемент этого списка имеет тип «Сообщение».

Что я делаю не так? Заранее спасибо!

Кодировано 1:

Parse.initialize(new Parse.Configuration.Builder(this)
.applicationId("test")
.enableLocalDataStore()
.clientBuilder(builder)
.server("http://someinstallation.com/parse/")
.build());

Кодировано 2:

ParseQuery query = ParseQuery.getQuery(Message.class);
ArrayList idsToQuery = new ArrayList<>();
idsToQuery.add(getSenderID());
idsToQuery.add(getRecipiantID());
query.whereContainedIn("sender", idsToQuery);
query.whereContainedIn("recipiant", idsToQuery);
query.orderByDescending("createdAt");
query.findInBackground(new FindCallback() {
    public void done(List messages, ParseException e) {
        if (e == null) {
           addMessagesTomList(messages);
        }
        else {
           Log.e("message", "Error Loading Messages" + e);
        }
    }
}); `

person thifil    schedule 09.07.2017    source источник


Ответы (1)


Я думаю, вы забыли сделать несколько шагов, прежде чем начать использовать свои подклассы Parse, поэтому для создания подкласса (в вашем случае Message) вам нужно сделать следующее:

  1. Создайте новый класс, который расширяется от класса ParseObject.
  2. Добавьте свойства, которые вы хотите, чтобы этот подкласс имел с помощью сеттеров и геттеров
  3. Аннотируйте новый класс с помощью @ParseClassName("Message")

В конце ваш подкласс должен выглядеть следующим образом:

import com.parse.ParseClassName;
import com.parse.ParseObject;

@ParseClassName("Message")
public class CheckIn extends ParseObject {

    public String getContent() {
        return getString("content");
    }

    public void setContent(String content) {
        put("content", content);
    }

    public String getTitle() {
        return getString("title");
    }

    public void setTitle(String title) {
        put("title", title);
    }

}

Наконец, перейдите туда, где вы инициализируете Parse SDK (обычно в файле приложения) и зарегистрируйте новый созданный вами подкласс:

ParseObject.registerSubclass(Message.class);

Если вы пройдете шаги, описанные выше, это сработает для вас.

person Ran Hassid    schedule 11.07.2017