Ios Parse.com关系和acl

Ios Parse.com关系和acl,ios,parse-platform,Ios,Parse Platform,我有一个“place”类和一个“checkin”类,还有一个特殊的“User”类。“签入”有一个指向“地点”和“用户”的指针。简单地说,用户可以记录他访问过的地方 “place”类仅具有读取权限,“checkin”同时具有读取和写入权限 当创建一个“checkin”对象时,我得到了错误103:不允许该用户在place上执行更新操作 我试着用关系代替指针,但还是遇到了同样的问题 我不希望“place”对象是可更新的,我也不明白为什么parse在内部尝试更新它 let checkin = PFObj

我有一个“place”类和一个“checkin”类,还有一个特殊的“User”类。“签入”有一个指向“地点”和“用户”的指针。简单地说,用户可以记录他访问过的地方

“place”类仅具有读取权限,“checkin”同时具有读取和写入权限

当创建一个“checkin”对象时,我得到了错误103:不允许该用户在place上执行更新操作

我试着用关系代替指针,但还是遇到了同样的问题

我不希望“place”对象是可更新的,我也不明白为什么parse在内部尝试更新它

let checkin = PFObject(className: "checkin")
    checkin["user"] = PFUser.currentUser()
    let place = PFObject(className: "place")
    place.objectId = shop.id
    checkin["place"] = place
    checkin.saveInBackgroundWithBlock { (saved: Bool, error: NSError?) -> Void in
        if saved && error == nil {
            success()
        } else {
            //
        }
    }
你知道为什么会发生这种情况吗?我如何对数据进行建模以使其按预期工作

编辑:我添加调用以创建签入对象的代码。可以看出,地点和用户已经存在,所以我不打算更新它

let checkin = PFObject(className: "checkin")
    checkin["user"] = PFUser.currentUser()
    let place = PFObject(className: "place")
    place.objectId = shop.id
    checkin["place"] = place
    checkin.saveInBackgroundWithBlock { (saved: Bool, error: NSError?) -> Void in
        if saved && error == nil {
            success()
        } else {
            //
        }
    }

不共享任何代码就有点难以诊断,因为问题可能也与您在代码中尝试执行的操作有关。我不能评论澄清,所以我将发布我怀疑正在发生的事情的答案。如果不是这样,请评论或编辑你的帖子,我很乐意进一步帮助你

问题可能与您使用指针无关。。。我使用指针,没有这样的问题

我认为正在发生的是,基于您的权限,它不允许云创建适当的位置。如果您还未检查“创建”一个场所的能力,那么这肯定是正确的。我理解错误表明这是一个具体的更新,但我以前也有错误/误导性错误。如果是这种情况,请允许创建。或者,如果您不希望公众能够创建位置,那么请确保当前用户具有正确的ACL来创建位置,或者正在运行的云代码正在使用主密钥

如果您的案例中没有发生这些情况,并且您不想共享代码,我可以推荐另一种解决方法。保留public for place的总体类权限,以确保正确执行初始化。然后,可能在保存后的回调中,将ACL设置为no write


编辑:下面的注释处理添加的代码

如果不共享任何代码,就有点难以诊断,因为问题可能也与您在代码中尝试执行的操作有关。我不能评论澄清,所以我将发布我怀疑正在发生的事情的答案。如果不是这样,请评论或编辑你的帖子,我很乐意进一步帮助你

问题可能与您使用指针无关。。。我使用指针,没有这样的问题

我认为正在发生的是,基于您的权限,它不允许云创建适当的位置。如果您还未检查“创建”一个场所的能力,那么这肯定是正确的。我理解错误表明这是一个具体的更新,但我以前也有错误/误导性错误。如果是这种情况,请允许创建。或者,如果您不希望公众能够创建位置,那么请确保当前用户具有正确的ACL来创建位置,或者正在运行的云代码正在使用主密钥

如果您的案例中没有发生这些情况,并且您不想共享代码,我可以推荐另一种解决方法。保留public for place的总体类权限,以确保正确执行初始化。然后,可能在保存后的回调中,将ACL设置为no write


编辑:下面的注释处理添加的代码

我想您正在尝试使用
shop.id
查询对象。我不太熟悉iOS编程,但iOS上的查询如下所示:

PFQuery *query = [PFQuery queryWithClassName:@"GameScore"];
[query getObjectInBackgroundWithId:@"xWMyZ4YEGZ" block:^(PFObject *gameScore, NSError *error) {
    // Do something with the returned PFObject in the gameScore variable.
    NSLog(@"%@", gameScore);
}];
// The InBackground methods are asynchronous, so any code after this will run
// immediately.  Any code that depends on the query result should be moved
// inside the completion block above.

我想您正在尝试使用
shop.id
查询对象。我不太熟悉iOS编程,但iOS上的查询如下所示:

PFQuery *query = [PFQuery queryWithClassName:@"GameScore"];
[query getObjectInBackgroundWithId:@"xWMyZ4YEGZ" block:^(PFObject *gameScore, NSError *error) {
    // Do something with the returned PFObject in the gameScore variable.
    NSLog(@"%@", gameScore);
}];
// The InBackground methods are asynchronous, so any code after this will run
// immediately.  Any code that depends on the query result should be moved
// inside the completion block above.

不确定是否有用于索引或其他内容的内部链接,您当然可以在云代码中执行,因为您可以使用master键。我不确定,但可能是因为这一行吗?place.objectId=shop.id不确定是否有用于索引或其他内容的内部链接,您当然可以在云代码中这样做,因为您可以使用主密钥。我不确定,但可能是因为这一行?place.objectId=shop.id谢谢您的评论。我添加了代码以防有用。如您所见,place已经存在,因此不需要创建或更新它,它被设置为签入对象的参数。@Jonatin我不熟悉您的一些语法,也不确定Parse是否支持“let”,但这些可能与您的问题无关。但是,当您有
let place=PFObject(className:“place”)
时,您正在代码中创建一个place对象,您还需要保存此对象,以便稍后供父签入对象使用。@Jonatin我仔细考虑了您的代码。您是否正在尝试将
签入[“地点”]
分配给现有的
地点
对象,该对象的id已为
商店.id
?为此,您需要执行一个查询。您不能简单地这样设置id,您需要检索您试图引用的实际对象。也可以忽略我对语法的评论,让。。。我没有注意你的环境。@papergozilla,我同意,我想他是想查询他的place类,查找id与shop.id匹配的对象。@papergozilla如果我像你说的那样使用parse对象,而不是id,似乎会起作用。那样的话,它就如预期的那样工作了。如果您可以使用ids来减少请求的数量,那就太好了。谢谢您的评论。我添加了代码以防有用。如您所见,place已经存在,因此不需要创建或更新它,它被设置为签入对象的一个参数。@Jonatin我不熟悉一些