通过指针解析排序查询
Parse sort query via pointer
我需要使用 Parse 进行简单的查询排序。
我有两个 类:Captain
和 Boat
。每个 Captain
都有一个 Boat
指针对象。
我在 table 中列出了所有 Captain
对象及其属性,例如名称、Boat
名称等
我需要能够通过 Boat
名称对 Captain
对象的查询进行排序。我怎么能?
我可以使用 NSSortDescriptor
排序键对直接属性进行排序,例如 Captain
name
。但是我需要根据 Boat
.
的 name
对 Captain
对象进行排序
如果你能在排序限定符上使用点符号,那就太好了,比如:
[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 很有帮助地指出,如果您的查询页面涉及数千名船长,则此答案无法很好地扩展。如果船长数量很大,最好包含一个船->船长指针并执行以下操作:
更迂回地,你可以取船,按升序排列他们的名字,includeKey他们的船长(如果你的船有船长的后向指针),然后为他们的船长映射返回的(排序的)船。
您可以使用关系查询进行多个查询,查询代码如下所示:
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
有一个可扩展的解决方案,开销很小:
目前您有 table 艘船和 table 艘船长,其中每个船长都包含一个指向一艘船的指针。
您应该添加第三个 table - 我们称它为 'captains boats',其中包含船长对象中包含的所有船只。您可以通过在添加新船长时添加船并在删除船长时将其从 table 中删除来维护它。
为了按船长对船长进行排序:
- 查询 'CaptainsBoats',按任意排序。请注意,即使此 table 包含一百万条记录,您也会获得与您相关的第一个 X。
查询 'Captains',使用 'containedIn' 方法和步骤 1 中的船列表:[captainQuery whereKey:"boat" containedIn:boatList]
.
现在您只有您需要的船长对象(一百万个中)。根据任何地方对它们进行排序。
我需要使用 Parse 进行简单的查询排序。
我有两个 类:Captain
和 Boat
。每个 Captain
都有一个 Boat
指针对象。
我在 table 中列出了所有 Captain
对象及其属性,例如名称、Boat
名称等
我需要能够通过 Boat
名称对 Captain
对象的查询进行排序。我怎么能?
我可以使用 NSSortDescriptor
排序键对直接属性进行排序,例如 Captain
name
。但是我需要根据 Boat
.
name
对 Captain
对象进行排序
如果你能在排序限定符上使用点符号,那就太好了,比如:
[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 很有帮助地指出,如果您的查询页面涉及数千名船长,则此答案无法很好地扩展。如果船长数量很大,最好包含一个船->船长指针并执行以下操作:
更迂回地,你可以取船,按升序排列他们的名字,includeKey他们的船长(如果你的船有船长的后向指针),然后为他们的船长映射返回的(排序的)船。
您可以使用关系查询进行多个查询,查询代码如下所示:
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
有一个可扩展的解决方案,开销很小: 目前您有 table 艘船和 table 艘船长,其中每个船长都包含一个指向一艘船的指针。
您应该添加第三个 table - 我们称它为 'captains boats',其中包含船长对象中包含的所有船只。您可以通过在添加新船长时添加船并在删除船长时将其从 table 中删除来维护它。
为了按船长对船长进行排序:
- 查询 'CaptainsBoats',按任意排序。请注意,即使此 table 包含一百万条记录,您也会获得与您相关的第一个 X。
查询 'Captains',使用 'containedIn' 方法和步骤 1 中的船列表:
[captainQuery whereKey:"boat" containedIn:boatList]
.现在您只有您需要的船长对象(一百万个中)。根据任何地方对它们进行排序。