即使在成功固定后从本地数据存储区查询时,ParseQuery 也会给出 0 个对象

ParseQuery gives 0 objects when querying from local datastore even after successfully pinning

我正在使用 parse.com 的 Android SDK,遇到了一个奇怪的问题。

来自片段的 onCreate:

  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的bug?
任何见解将不胜感激我几天来一直在努力寻找问题。

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);

注:

我发现了问题。它似乎更像是 Android SDK of parse 的一个错误。我将其缩小为使用 Android SDK 检索具有特殊 ACL 的固定对象的问题。

最初,该对象具有 ACL,因此只有角色 'Admin'(我创建的)可以读写。有趣的是,我用来测试固定和查询的用户是 'Admin'!但是,当我将 ACL 更改为 public 可以读取但只有管理员可以写入时,问题就解决了!

我的理论是 查询本地数据存储的行为类似于 public 查询,无论进行查询的用户具有什么角色!但是,如果有任何其他理论可以解释这一点,我们将不胜感激。幸运的是,在我的例子中,我需要 public 读取访问权限,但是对于一些需要读取访问限制 ACL 的人来说,这个错误可能是一个巨大的失败!希望 parse.com 能尽快解决这个问题。
这是一个相当大的问题!我很惊讶我找不到关于这个问题的问题。

是的所以基本上你必须为当前用户设置 ACL 并在固定聊天组之前固定它。

ParseACL acl = new ParseACL();
acl.setReadAccess(ParseUser.getCurrentUser(), true);
ParseUser.getCurrentUser().setACL(acl);
ParseUser.getCurrentUser().pinInBackground();

Parse 似乎不支持本地数据存储上的 ACL。因此,解决此问题的最简单方法是对查询执行 ignoreACLs() - 假设您确实在服务器端正确设置了 roles/acls,因此无论您在本地固定什么,都应该已经获得许可。