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

时间:2015-06-07 14:23:09

标签: android parse-platform offline querying pinning

我正在使用parse.com的Android SDK,并且遇到了一个特殊的问题。

来自片段的onCreate:

  1. 从服务器获取对象。
  2. 别住它。
  3. 从本地数据存储中获取对象。
  4. 以下是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类出了什么问题。
    • 我在parse.com数据浏览器的ChatGroup类中添加了两个字段:name(字符串)和消息(Relation),对一个名为Admin的角色具有读写权限。
    • 当浏览到实际的解析db(使用root访问权限)时,我发现数据库表(ParseObjects)确实包含我固定的行。但不知何故解析显示0查询结果!

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

最初,对象具有ACL,只有“Admin”(我创建的)角色才能读写。有趣的是,我正在测试固定和查询的用户是“管理员”!但是,当我更改ACL以便公众可以阅读但只有管理员可以写,问题就解决了!

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

答案 2 :(得分:1)

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

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