2013-10-05 19 views
1

我有一个复合查询,如下所示。Parse.com - 奇怪的includeKey问题

- (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。然而,数据库中的(当前)26张照片中有3张在该领域有评论,因此我应该在该领域获得3张照片。一个commentObject会加载所有的字段。然而,如果我遗漏了那条includeKey行,那么在该字段中有某些东西的所有3个photoObjects都会在该字段中返回一个commentObject。但是,在这种情况下,对象是空的,我不得不打电话fetchIfNeeded检索他们的数据。

我宁愿不这样做,并且必须重新加载tableView on callback,如果我能以正确的方式第一次加载数据。

任何想法?

回答

1

什么是photosQuery

如果是这样:

[photosFromSameLevelUsersQuery includeKey:kWSPhotoCommentObjectForTitleKey]; 
+0

拍摄。在复制/粘贴/清理代码时,我总会遇到一些混合的方法。我运行它的方法现在显示,运行时它是'photosFromSameLevelUsersQuery',所以这不是问题。抱歉。 – Ramsel

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对象时开始设置isTitle字段,并因此调用了cloudCode beforeSave方法中的条件,更改ACL的条件。


有一点需要注意Parse.com的是,在使用beforeSave时Parse.Cloud.useMasterKey();的ACL更改都应该先限定只对功能。我相信是这样 - 如果有人有更正确的信息,请纠正我。但是,在这种情况下,ACL变化似乎变得永久。

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