ParseQuery выдает 0 объектов при запросах из локального хранилища данных даже после успешного закрепления
Я использую Android SDK parse.com и столкнулся с особой проблемой.
Из фрагмента наСоздать:
- Получить объект с сервера.
- Приколи это.
- Получить объект из локального хранилища данных.
Вот фрагмент кода из 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();