使用 ParseQueryAdapter 查询本地数据存储即使在成功固定后也会给出 0 个结果

Querying local datastore in using ParseQueryAdapter gives 0 results even after successfully pinning

背景:
我正在为 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 无法从本地数据存储中检索 ChatGroups,它会从解析中检索它,固定它,然后触发 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 应该在第一次触发 updateLocalDatastore() 时检索 0 列表,它从解析中提取 3 ChatGroups,固定它们,然后它应该从本地数据存储接收 3。 然而,正如在日志中所见,即使在成功固定它们之后,它仍继续从本地数据存储中找到 0 ChatGroups!

项目设置看起来不错:

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 {

有人说它是一个解析 与本地数据存储中的关系。但我什至没有使用关系。即使是来自本地数据存储的简单查询也不起作用。

虽然我无法解决问题,但我发现了问题所在。该问题与 Android 的 Parse SDK 的潜在错误有关: