2013-10-05 26 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後續保存期間。