Запрос локального хранилища данных при использовании ParseQueryAdapter дает 0 результатов даже после успешного закрепления
Фон:
Я работаю над приложением групповых сообщений для Android, используя parse.com в качестве моего бэкэнда.
За работой:
У меня есть 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; } }); }
Фрагмент, который содержит его, слушает его, добавив
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 объектов при запросах из локального хранилища данных даже после успешного закрепления