便利Backpointer一对多

时间:2013-12-12 16:36:30

标签: objective-c one-to-many parse-platform

我想在Parse.com上模拟用户和checkIns之间的一对多关系。另外,我希望用户有一个方便指针指向它的lastCheckin,以避免查询checkIns以获取用户最近的checkIn。使用以下代码,用户的lastCheckin列在数据浏览器中始终为空:

PFUser *currentUser = [PFUser currentUser];

PFObject *checkIn = [PFObject objectWithClassName:@"CheckIn"];
checkIn[@"forUser"] = currentUser;
checkIn[@"foursquareID"] = selectedVenue[@"id"];
checkIn[@"name"] = selectedVenue[@"name"];

checkIn[@"location"] = [PFGeoPoint geoPointWithLatitude:[selectedVenue[@"location"][@"lat"] doubleValue]
                                              longitude:[selectedVenue[@"location"][@"lng"] doubleValue]];

[checkIn saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
    currentUser[@"lastCheckin"] = checkIn;
    [currentUser saveInBackground];
}];

删除以下行会导致User.lastCheckin在数据浏览器中正确指向所需的CheckIn,但显然会破坏一对多链接:

checkIn[@"forUser"] = currentUser;

有没有办法让我同时获得用户和CheckIns以及User.lastCheckIn指针之间的一对一关系?

1 个答案:

答案 0 :(得分:0)

如果您在每次创建新lastCheckin时在用户上设置CheckIn,则可以通过抓取当前用户并lastCheckin包含includeKey来轻松访问该签名}。

http://blog.parse.com/2011/12/06/queries-for-relational-data/

要获取用户的所有签到,您只需查询当前用户等于CheckIn的{​​{1}}类。那是你的一对多关系。您不需要在User类上维护checkins关系,因为您有一个指针从每个CheckIn实例返回给用户作为指针。在用户实例上设置forUser时,您不会更改旧签到时的属性。

也许您认为这就像使用主键和外键的SQL一样。因为我有SQL背景,所以我对NoSQL感到困惑。我总是学习像Parse和NoSQL一样思考。我在上面看到的就是查询用户的所有签到以及用户的最后签到所需的全部内容。您还可以简单地查询用户的所有签到,将结果限制为1并对其进行排序,以便最新签入是第一个结果。它在Parse上应该非常快。

您可能还希望了解如何使用Cloud Code。您可以调用Cloud Code函数,只需传递创建新签入所需的参数,并在Cloud Code中完成所有这些工作。可以使用“保存后”功能更新用户的lastCheckin

http://www.parse.com/docs/js/symbols/Parse.Cloud.AfterSaveRequest.html

如果您使用Cloud Code,则无需更新iOS应用即可更新数据的管理方式。