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

Я использую Android SDK parse.com и столкнулся с особой проблемой.

Из фрагмента наСоздать:

  1. Получить объект с сервера.
  2. Приколи это.
  3. Получить объект из локального хранилища данных.

Вот фрагмент кода из onCreate:

ParseObject myChatGroup = ParseObject.createWithoutData("ChatGroup", "mOJGWRiLPC");
    myChatGroup.fetchInBackground(new GetCallback<ParseObject>() {
        @Override
        public void done(ParseObject chatGroup1, ParseException e) {
            if (e == null) {
                l.d("Fetched chat group: " + chatGroup1 + " from server");
                chatGroup1.pinInBackground(new SaveCallback() {
                    @Override
                    public void done(ParseException e) {
                        if (e == null) {
                            l.d("Successfully pinned chat group");
                            ParseQuery<ParseObject> chatGroupParseQuery = new ParseQuery<>("ChatGroup");
                            chatGroupParseQuery.fromLocalDatastore()
                                    .findInBackground(new FindCallback<ParseObject>() {
                                        @Override
                                        public void done(List<ParseObject> list, ParseException e) {
                                            if (e == null) {
                                                l.d("Found " + list.size() + " chat groups from local datastore");
                                            } else {
                                                e.printStackTrace();
                                            }
                                        }
                                    });
                        } else {
                            e.printStackTrace();
                        }
                    }
                });
            } else {
                e.printStackTrace();
            }
        }
});

Вот журнал:

Fetched chat group: ChatGroup { objectId: mOJGWRiLPC, name: Admin } from server
Successfully pinned chat group
Found 0 chat groups from local datastore

Но это не имеет никакого смысла! Я просто прикрепил объект, так как может быть 0 объектов в локальном хранилище данных. Код так прост. Что я делаю неправильно? Может ли это быть ошибка с SDK?
Любое понимание будет высоко ценится, я пытался найти проблему в течение нескольких дней.

Настройка Parse выглядит хорошо для меня:

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

Замечания:

  • Он отлично работает при попытке использовать ту же логику с объектом ParseUser. И даже другие мои классы, как мой Message что заставляет меня подозревать, что что-то не так с моим классом ChatGroup.
  • Я добавил два поля в мой ChatGroup класс в браузере данных parse.com: имя (String) и сообщения (Relation) с доступом для чтения и записи к роли с именем Admin.
  • При просмотре фактического разбора базы данных (с использованием корневого доступа) я обнаружил, что таблица базы данных (ParseObjects) содержит строку, которую я закрепил. Но как-то анализ показывает 0 результатов при запросе!

3 ответа

Решение

Я нашел проблему. Похоже, это больше похоже на ошибку с Android SDK синтаксического анализа. Я сузил его до проблемы с извлечением закрепленных объектов с помощью специальных списков ACL с помощью Android SDK.

Первоначально объект имел ACL, так что только роль "Администратор" (которую я создал) может читать и писать. Самое смешное, что пользователь, с которым я тестировал пиннинг и запросы, был "Администратором"! Но когда я изменил ACL так, что public может читать, а писать может только Admin, проблема была решена!

Моя теория заключалась в том, что запросы к локальному хранилищу данных ведут себя как открытый запрос, независимо от того, какую роль играет пользователь, выполняющий запрос! Но если бы любая другая теория, объясняющая это, была бы оценена. К счастью, в моем случае мне нужен открытый доступ для чтения, но эта ошибка может привести к огромным ошибкам для тех, кому нужен ACL, ограничивающий доступ на чтение! Надеемся, что parse.com скоро исправит эту проблему.
Это довольно большая проблема! Я удивлен, что не смог найти вопрос по этому вопросу.

Кажется, что Parse не поддерживает ACL в локальном хранилище данных. Таким образом, самый простой способ обойти эту проблему - это выполнить ignoreACLs() в запросе - при условии, что у вас правильно настроены роли / acls на стороне сервера, поэтому все, что вы прикрепили локально, уже должно быть в порядке разрешений.

Да, так что в основном вы должны установить ACL для текущего пользователя и закрепить его перед тем, как закрепить группу чата.

ParseACL acl = new ParseACL();
acl.setReadAccess(ParseUser.getCurrentUser(), true);
ParseUser.getCurrentUser().setACL(acl);
ParseUser.getCurrentUser().pinInBackground();
Другие вопросы по тегам