保存用户会导致找不到对象错误

时间:2014-07-02 11:59:05

标签: objective-c parse-platform

保存用户会导致错误:找不到更新对象(代码:101,版本:1.2.19)

   [PFGeoPoint geoPointForCurrentLocationInBackground:^(PFGeoPoint *geoPoint, NSError *error) {
        if (!error) {
            [PFUser currentUser].location = geoPoint;
            [[PFUser currentUser] save];
        }
    }];

我做错了什么?

http post request https://api.parse.com/2/update

{
    "iid": "[redacted]",
    "classname": "_User",
    "data": {
        "email": "test@test.com",
        "objectId": "[redacted]"
    },
    "session_token": "[redacted]",
    "v": "i1.2.19",
    "uuid": "[redacted]"
}

响应

{
    "code": 101,
    "error": "object not found for update"
}

3 个答案:

答案 0 :(得分:1)

我和你有同样的问题,我做了一些测试并找出根本原因:

  • 将新游戏GameScore创建为document
  • 执行相同的创建和更新对象,并发现它运作良好
  • 检查“ACL”列并与您的问题数据进行比较。见?

Works ACL, I done modify for * to make it clear
工作ACL,我为*做了修改以使其清楚

enter image description here
ACL失败。

正如您可以看到写入权限锁定到用户“6iIv5XWZvM”,这就是为什么您的更新将“找不到对象”

您可以将数据记录直接更改为“*”,以使您的更新正常运行。

OK!以下是解决方案:

  1. 更改每条记录“ACL”数据col,如下所示:

    {“*”:{“write”:true,“read”:true}}

  2. 您需要以特定用户身份登录PFUSer才能将ACL更改为public。对于我的情况,使用objectId将是“6iIv5XWZvM”。我需要设置密码和登录信息,并使用代码登录和修改它。详细介绍iOS代码如下:

     //iOS Sample
     [PFUser logInWithUsernameInBackground:@"USERNAME" password:@"PASSWORD" block:^(PFUser *user, NSError *error) {
        if (user) {
            PFQuery *query = [PFQuery queryWithClassName:CLASS_NAME];
            [query findObjectsInBackgroundWithBlock:^(NSArray *objs, NSError *error) {
                for (PFObject *obj in objs) {
                    PFACL *defaultACL = [PFACL ACL];
                    [defaultACL setPublicReadAccess:YES];
                    [defaultACL setPublicWriteAccess:YES];
                    [obj setACL:defaultACL];
                    [obj saveInBackground];
                }
            }];
        } else {
            // The login failed. Check error to see why.
            }
    }];
    
  3. 但是,请记住在保存新数据之前添加以下设置,如果您不想再发生这种情况(注意:这将是安全问题)

    //It is iOS code sample.
    PFACL *defaultACL = [PFACL ACL];
    [defaultACL setPublicReadAccess:YES];
    [defaultACL setPublicWriteAccess:YES];
    [PFACL setDefaultACL:defaultACL withAccessForCurrentUser:YES];
    

答案 1 :(得分:0)

试试这个,我正在使用它,当我需要为当前用户保存对象时。希望它会有所帮助。

        PFUser *user = [PFUser currentUser];
        [user setObject:geoPoint forKey:@"location"];

        [user saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
            if (error){
                NSLog(@"Error %@ %@", error, [error userInfo]);
            }
        }];

答案 2 :(得分:0)

当您尝试保存用户没有ACL访问权限的对象时,会附加错误:“找不到更新的对象”。

为了让用户更改对象,您需要在创建对象时设置PFACL权限:

对于特定用户:

PFObject *object = /*the object you want to save*/
NSString *userID = /*the objectID of the user you want to let perform modifications later*/
PFACL *groupACL = [PFACL ACL];
[groupACL setWriteAccess:YES forUserId:userID];
object.ACL = groupACL;

对于所有用户:

PFObject *object = /*the object you want to save*/
NSString *userID = /*the objectID of the user you want to let perform modifications later*/
PFACL *groupACL = [PFACL ACL];
[groupACL setPublicWriteAccess:YES];
object.ACL = groupACL;