1

我正在尝试从在线后端以及本地数据存储加载对象。因此我使用了两个不同的查询。先在线查询:

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 不为零。如果我删除[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");
    }
}];
4

1 回答 1

2

根据我们上面的讨论;

如果您有一个活动的 PFUser 会话,那么该用户将自动被指定为所有者。即使您没有当前会话并且[PFUser currentUser]设备没有本地数据存储。目前,本地数据存储存在偏见。由于应用程序是沙盒化的,并且您在自己的资源包之外没有写入权限,因此其他用户无法更改/更新您的本地数据存储。即使使用后端,您也无法更新 User 类中的任何用户信息,除非您的当前用户或具有写入权限。对于本地数据存储,无论会话如何,始终假定您是“当前用户”。但是,如果您确实想忽略本地数据存储中受保护信息的角色,您可以在此处查看他们的注释:

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

适用于 Parse 中对象的相同安全模型适用于本地数据存储中的对象。读写权限由 PFACL 定义,用户无法访问或修改他们无权访问的任何内容。

唯一的区别是,由于角色存储在服务器上,因此您将无法访问受基于角色的 ACL 保护的任何数据。要访问受基于角色的 ACL 保护的数据,您需要在执行本地数据存储区查询时忽略 ACL

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

于 2015-03-02T16:54:46.717 回答