通过指针解析排序查询

时间:2015-01-06 17:47:02

标签: ios objective-c sorting parse-platform

我需要使用Parse进行简单的查询排序。

我有两个课程:CaptainBoat。每个Captain都有一个Boat指针对象。

我列出了表中包含其属性的所有Captain个对象,例如名称,Boat名称等。

我需要能够通过Captain名称对Boat个对象的查询进行排序。我怎么能?

我可以使用NSSortDescriptor排序键(例如Captain name)对直接属性进行排序。但我需要按Captain的{​​{1}}对name个对象进行排序。

3 个答案:

答案 0 :(得分:4)

如果您可以在排序限定符上使用点表示法,那会很好,例如:

[captainQuery orderByAscending:@"boat.name"];

不幸的是,属性点符号仅适用于includeKey:。所以这样做的方法是获取,包括相关对象,然后使用相关对象的属性进行本地排序:

// ...
[captainQuery includeKey:@"boat"];
[query findObjectsInBackgroundWithBlock:^(NSArray *captains, NSError *error) {
    NSArray *sortedCaptains = [captains sortedArrayUsingComparator: ^(PFObject *capA, PFObject *capB) {
        return [capA[@"boat"][@"name"] compare:capB[@"boat"][@"name"]];
        // or reverse param order for descending
    }];
}];

编辑 - @Logan有帮助地指出,如果您的查询通过数千名队长登录,则此答案无法很好地扩展。如果船长数量很大,那么最好包括一艘船 - >船长指针并执行以下操作:

更多的是,你可以取船,命令他们的名字,包括他们的船长(如果你的船有一个指向船长的指针),然后在返回的(分类的)船上映射他们的船长。

答案 1 :(得分:0)

您可以对多个查询使用关系查询,查询代码应如下所示:

PFObject *captain = [PFObject objectWithClassName:@"Captain"];
PFRelation *relation = [captain relationForKey:@"Boat"];
PFQuery *relQuery = [relation query];
[relQuery orderByDescending:@"name"];
// Add other query constraints

[relQuery findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (error) {
       // There was an error
    } else {
       // All the captains sorted by related boat's names
    }
}];

下面有一些有用的链接:

http://blog.parse.com/2012/05/17/new-many-to-many/ https://parse.com/docs/ios_guide#objects-pointers/iOS

答案 2 :(得分:0)

有一个可扩展的解决方案,开销相当小: 目前你有一张船只和一张船长桌,每个船长都有一个指向船的指针。

您应该添加第三个表格 - 让我们称之为“船长”船只,其中包含船长对象中包含的所有船只。你可以通过在添加新船长时添加船只并在删除船长时将其从表中删除来维护它。

为了按船只对船长进行分类:

  1. 查询' CaptainsBoats',按任意排序。请注意,即使此表包含一百万条记录,您也将获得与您相关的第一个X.
  2. 查询'队长',使用' containsIn'使用步骤1中的船只清单的方法:[captainQuery whereKey:"boat" containedIn:boatList]

  3. 现在你只有你需要的队长对象(可能是百万)。根据任何事情在本地对它们进行排序。