2015-03-02 101 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

但是,我认为您不需要考虑您的情况。