Parse.com - 奇怪的includeKey问题

时间:2013-10-05 04:31:05

标签: key parse-platform

我有一个复合查询,如下所示。

 - (PFQuery *)queryForPhotos {

        if (![PFUser currentUser]) {
            PFQuery *query = [PFQuery queryWithClassName:kPAPPhotoClassKey];
            [query setLimit:0];
            return query;
        }

        // Query for users with the same language level
        PFQuery *sameLevelUsersQuery = [PFUser query];
        [sameLevelUsersQuery whereKey:kWSUserLanguageLevelKey equalTo:[[PAPCache sharedCache] languageLevelForUser:[PFUser currentUser]]];
        sameLevelUsersQuery.cachePolicy = kPFCachePolicyNetworkOnly;
        sameLevelUsersQuery.limit = 1000;

        PFQuery *photosFromSameLevelUsersQuery = [PFQuery queryWithClassName:kPAPPhotoClassKey];
        [photosFromSameLevelUsersQuery whereKey:kPAPPhotoUserKey matchesQuery:sameLevelUsersQuery];
        [photosFromSameLevelUsersQuery whereKeyExists:kPAPPhotoPictureKey];


        [photosFromSameLevelUsersQuery whereKey:kWSUniversalIsDeletedKey notEqualTo:[NSNumber numberWithBool:YES]];
        [photosFromSameLevelUsersQuery includeKey:kWSPhotoCommentObjectForTitleKey]; // THE INCLUDED KEY IN QUESTION
        [photosFromSameLevelUsersQuery orderByDescending:@"createdAt"];

        // A pull-to-refresh should always trigger a network request.
        [photosFromSameLevelUsersQuery setCachePolicy:kPFCachePolicyNetworkOnly];

        return photosFromSameLevelUsersQuery;

    }

如果我留下这一行:

        [photosFromSameLevelUsersQuery includeKey:kWSPhotoCommentObjectForTitleKey]; // THE INCLUDED KEY IN QUESTION

然后我只得到1个在该字段中包含commentObject的photoObject。但是,DB中的3张(当前)26张照片在该字段中都有commentObjects,因此我应该在该字段中获得3张照片。一个commentObject加载了它的所有字段。

但是,如果我省略includeKey行,那么所有3个带有该字段内某些内容的photoObject都会在该字段中返回一个commentObject。但是,在这种情况下,对象是空的,我必须调用fetchIfNeeded来检索他们的数据。

我宁愿不这样做,如果我能在第一次以正确的方式加载数据,就必须在回调时重新加载tableView。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

什么是photosQuery

应该是:

[photosFromSameLevelUsersQuery includeKey:kWSPhotoCommentObjectForTitleKey];

答案 1 :(得分:1)

哦,伙计。所以这是一个ACL问题。对于其他人来说这个问题对于Parse和数据存储来说是新的,我发现很多奇怪的问题都会回到ACL问题。

否则问题非常具体:

  • 我注意到我的ACL在我存储的较新评论中设置为:

    { “*”:{ “写”:真}}

这正是问题所在。根本没有设置读取ACL,因此任何人都无法读取评论对象。

为什么会这样?

  • 之前我设置了这个云代码,因为我想要由对象创建者以外的其他人更改注释对象:

      Parse.Cloud.beforeSave("Comments", function(request, response) {
    
            Parse.Cloud.useMasterKey();
    
            // Check if the isTitle field is being modified
            var dirty = request.object.dirty("isTitle");
    
            if (dirty == true) {
                  console.log("dirty == true");
    
                  var publicWriteACL = new Parse.ACL();
                  publicWriteACL.setPublicWriteAccess(true);
    
                  request.object.setACL(publicWriteACL);
            }
    
            response.success();
        });
    

以前只有一个我设置isTitle字段的实例,在这种情况下我希望其他人拥有写访问权限。

但是,我遇到了这个问题,所以我在创建一个Comment Object时开始设置isTitle字段,因此调用了cloudCode beforeSave方法中的条件,改变了ACL。


关于Parse.com需要注意的一点是,在beforeSave中使用Parse.Cloud.useMasterKey();时,ACL更改应该仅限于该函数。我相信是这样的 - 如果有人对此有更多正确的信息,请纠正我。但是,在这种情况下,似乎ACL更改成为永久性的。

这可能是因为它是在创建对象VS期间进行后续保存。