2015-03-02 100 views
1

我試圖從在線後端以及從本地數據存儲中加載對象。因此我使用了兩個不同的查詢。首先,網上查詢:使用[PFUser currentUser]在本地數據存儲上查詢時不返回對象

PFQuery *onlineQuery = [PFQuery queryWithClassName:@"Trip"]; 
[onlineQuery whereKey:@"users" equalTo:[PFUser currentUser]]; 

[onlineQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    if (!error) { 
     NSLog(@"Trips loaded from server!"); 
    } else { 
     NSLog(@"Could not load trips from server!"); 
     [onlineQuery cancel]; 
    } 
}]; 

的本地數據存儲,查詢看起來是這樣的:

PFQuery *localQuery = [PFQuery queryWithClassName:@"Trip"]; 
[localQuery whereKey:@"users" equalTo:[PFUser currentUser]]; 
[localQuery fromLocalDatastore]; 

[localQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { 
    // at this point the objects array is empty, but should contain objects 
    NSLog(@"Trips loaded from local datastore!"); 
}]; 

的問題是,如果我做了網上查詢返回與當前用戶的所有對象。但本地查詢爲同一用戶返回0個對象。我也檢查過當前用戶不是零。如果我刪除行[localQuery whereKey:@"users" equalTo:[PFUser currentUser]];本地查詢返回所有對象,這意味着它們已成功保存。將對象保存到本地數據存儲區時的方法也會返回成功保存。

PFObject *newTrip = [PFObject objectWithClassName:@"Trip"]; 

PFRelation *rel = [newTrip relationForKey:@"users"]; 
[rel addObject:[PFUser currentUser]]; 

[newTrip pinInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { 
    if (succeeded) { 
     // succeeded is YES, therefore saving was succesful 
     NSLog(@"Trip saved to local datastore"); 
    } 
}]; 
+1

當前用戶是一個做固定的人,那麼爲什麼你需要交叉引用呢?另一個用戶不能把東西釘到你的本地數據存儲 – soulshined 2015-03-02 16:36:09

+0

這實際上是真的:)沒有想到這一點......感謝。 – gpichler 2015-03-02 16:37:48

回答

2

根據我們上面的討論;

如果您有一個活動的PFUser會話,那麼該用戶將自動被指定爲所有者。即使您沒有當前會話,也沒有[PFUser currentUser]本地數據存儲由設備擁有。目前,本地數據存儲是偏見。由於應用程序是沙箱式的,並且您沒有自己的資源包之外的寫入權限,所以另一個用戶無法更改更改/更新您的本地數據存儲區。即使在後端,您也不能更新User類中的任何用戶信息,除非您是當前用戶或擁有寫入權限。使用本地數據存儲,無論會話如何,始終認爲您是「當前用戶」。但是,如果你想忽略在本地數據存儲保護的信息的角色,你可以在這裏看到他們的筆記:

https://parse.com/docs/ios_guide#users-lds/iOS

適用於解析對象相同的安全模型適用於在本地數據存儲對象。讀寫權限由PFACL定義,用戶不能訪問或修改他們沒有權限的任何內容。

唯一的區別是,由於角色存儲在服務器上,您將無法訪問受基於角色的ACL保護的任何數據。要訪問受基於角色的ACL保護的數據,執行本地數據存儲查詢時需要忽略ACL

但是,我認爲您不需要考慮您的情況。