我尝试从在线后端以及本地数据存储中加载对象。因此,我使用了两个不同的查询。首先是在线查询:
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个对象。我还检查过currentUser是不是nil。如果我删除行[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");
}
}];
答案 0 :(得分:2)
根据我们上面的讨论;
如果您有一个有效的PFUser会话,那么该用户将被自动指定为所有者。即使您没有当前会话,设备也不拥有[PFUser currentUser]
本地数据存储。目前,本地数据存储是一种偏见。由于应用程序是沙盒的,并且您在自己的资源包之外没有写入权限,因此另一个用户无法更改更改/更新本地数据存储。即使使用后端,也无法更新User类中的任何用户信息,除非您是当前用户或具有写入权限。对于本地数据存储区,无论会话如何,它始终假定您是当前用户"。但是,如果您确实要忽略本地数据存储中受保护信息的角色,可以在此处查看其注释:
https://parse.com/docs/ios_guide#users-lds/iOS
适用于Parse中对象的相同安全模型适用于本地数据存储区中的对象。读写权限由PFACL定义,用户无法访问或修改他们无权访问的任何内容。
唯一的区别是,由于角色存储在服务器上,您无法访问受基于角色的ACL保护的任何数据。要访问受基于角色的ACL保护的此数据,您需要在执行本地数据存储区查询时忽略ACL
然而,考虑到你的情况,我觉得你不需要这样做。