【问题标题】:Query on local datastore with [PFUser currentUser] returns no objects使用 [PFUser currentUser] 查询本地数据存储不返回任何对象
【发布时间】:2015-05-02 17:40:51
【问题描述】:

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

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

【问题讨论】:

  • 当前用户是进行固定的用户,那么您为什么要交叉引用呢?其他用户无法将某些内容固定到您的本地数据存储中
  • 确实如此 :) 没想到...谢谢。

标签: ios parse-platform local-datastore


【解决方案1】:

根据我们上面的讨论;

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

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

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

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

但是,考虑到你的情况,我觉得你不需要这个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    相关资源
    最近更新 更多