2

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

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 数据浏览器上的类中添加了两个字段:名称(字符串)和消息(关系),具有对名为 Admin 的角色的读写访问权限。
  • 当浏览到实际的解析数据库(使用 root 访问)时,我发现数据库表 ( ParseObjects) 确实包含我固定的行。但是以某种方式解析在查询它时显示 0 结果!
4

3 回答 3

2

Parse 似乎不支持本地数据存储上的 ACL。因此,解决此问题的最简单方法是在查询上执行 ignoreACLs() ——假设您确实在服务器端正确设置了角色/acls,所以无论您在本地固定的任何内容都应该是许可的。

于 2015-09-12T17:24:20.090 回答
1

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

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

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

于 2015-06-08T08:49:53.593 回答
1

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

ParseACL acl = new ParseACL();
acl.setReadAccess(ParseUser.getCurrentUser(), true);
ParseUser.getCurrentUser().setACL(acl);
ParseUser.getCurrentUser().pinInBackground();
于 2015-07-16T13:41:09.763 回答