Запрос локального хранилища данных при использовании ParseQueryAdapter дает 0 результатов даже после успешного закрепления

Фон:
Я работаю над приложением групповых сообщений для Android, используя parse.com в качестве моего бэкэнда.

За работой:

  1. У меня есть ParseQueryAdapter, который запрашивает ChatGroups из локального хранилища данных, используя:

    public ChatGroupAdapter(final Context context) {
           super(context, new ParseQueryAdapter.QueryFactory<ChatGroup>() {
              public ParseQuery<ChatGroup> create() {
                  ParseQuery<ChatGroup> chatGroupQuery = ParseQuery.getQuery(ChatGroup.class);
                  chatGroupQuery.fromLocalDatastore();
                  Log.d(ChatGroup.class.getName(), "Constructor query: " +  
                  chatGroupQuery + " made");
                  //noinspection unchecked
                  return chatGroupQuery;
              }
       });
    }
    
  2. Фрагмент, который содержит его, слушает его, добавив ParseQueryAdapter.OnQueryLoadListener, Если ParseQueryAdapter не может получить ChatGroup s из локального хранилища данных, он извлекает его из анализа, закрепляет его и затем запускает ParseQueryAdapter повторить загрузку из локального хранилища данных, используя: .loadObjects();, Вот фрагмент кода из моего фрагмента:

    @Override
        public void onLoaded(List<ChatGroup> groups, Exception e) {
            l.d("onLoaded called");
            if (e != null) {
                e.printStackTrace();
                updateLocalDatastore();
            } else if (groups == null) {
                l.w("Received null group list.");
                updateLocalDatastore();
            } else if (groups.size() == 0) {
                l.w("Received group list of size zero.");
                updateLocalDatastore();
            } else {
                l.d("Chat groups loaded successfully");
            }
        }
    
    private void updateLocalDatastore() {
        final ParseQuery<ChatGroup> groupQuery = ParseQuery.getQuery(ChatGroup.class);
        groupQuery.findInBackground(new FindCallback<ChatGroup>() {
            @Override
            public void done(final List<ChatGroup> chatGroupList, ParseException e) {
                if (e != null) {
                    e.printStackTrace();
                } else {
                    if (chatGroupList != null) {
                        ParseObject.pinAllInBackground(chatGroupList, new SaveCallback() {
                            @Override
                            public void done(ParseException e) {
                                if (e != null) {
                                    e.printStackTrace();
                                } else {
                                    l.d("Successfully pinned: " + chatGroupList.size() +
                                            " groups to local datastore. Reloading adapter");
                                    groupAdapter.loadObjects();
                                }
                            }
                        });
                    } else {
                        l.e("Received null group list from cloud! " +
                                "Local datastore update failed!");
                    }
                }
            }
        });
    }
    

Результат:
А вот упрощенный журнал выполнения:

ChatFragment: onCreate
ChatFragment﹕ Initializing chat groups
ChatFragment﹕ Loading chat groups
ChatFragment: onStart
ChatFragment: onResume
ChatFragment﹕ onLoaded called
ChatFragment﹕ Received group list of size zero.
ChatFragment﹕ Successfully pinned: 3 groups to local datastore. Reloading adapter
ChatFragment﹕ Loading chat groups
ChatFragment﹕ onLoaded called
ChatFragment﹕ Received group list of size zero.
ChatFragment﹕ Successfully pinned: 3 groups to local datastore. Reloading adapter
ChatFragment﹕ Loading chat groups
ChatFragment﹕ onLoaded called
ChatFragment﹕ Received group list of size zero.
ChatFragment﹕ Successfully pinned: 3 groups to local datastore. Reloading adapter
ChatFragment﹕ Loading chat groups
ChatFragment﹕ onLoaded called
ChatFragment﹕ Received group list of size zero.

Мне кажется очевидным, что ParseQueryAdapter должен получить список 0 в первый раз, который вызывает updateLocalDatastore() который тянет 3 ChatGroup s из синтаксического анализа, прикрепите их, а затем он должен получить 3 из локального хранилища данных. Однако, как видно из журнала, он продолжает находить 0 ChatGroup s из местного хранилища данных даже после успешного закрепления!

Настройка проекта выглядит нормально:

Parse.enableLocalDatastore(this);
Parse.initialize(this, AppProps.properties.appId, AppProps.properties.clientKey);
ParseUser.enableRevocableSessionInBackground();
Parse.setLogLevel(Parse.LOG_LEVEL_DEBUG);
ParseObject.registerSubclass(ChatGroup.class);

Что я делаю неправильно?! Я что-то пропустил?

Я реализовал ту же логику с ParseUser и это сработало без нареканий! Кажется, что-то не так с тем же GroupChat:

@ParseClassName("ChatGroup")
public class ChatGroup extends ParseObject {

Некоторые говорят, что это ошибка разбора отношений в местном хранилище данных. Но я даже не использую отношения. Даже простой запрос из локального хранилища данных не работает.

1 ответ

Решение

Хотя я не мог решить проблему, я обнаружил, в чем проблема. Эта проблема связана с основной ошибкой в ​​Parse SDK Android: ParseQuery выдает 0 объектов при запросах из локального хранилища данных даже после успешного закрепления

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