使用[PFUser currentUser]查询本地数据存储区时不返回任何对象

时间:2015-03-02 11:26:08

标签: ios parse-platform local-datastore

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

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");
    }
}];

1 个答案:

答案 0 :(得分:2)

根据我们上面的讨论;

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

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

  

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

     

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

然而,考虑到你的情况,我觉得你不需要这样做。