通过指针解析排序查询

Posted

技术标签:

【中文标题】通过指针解析排序查询【英文标题】:Parse sort query via pointer 【发布时间】:2015-01-06 17:47:01 【问题描述】:

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

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

我在一个表中列出了所有Captain 对象及其属性,例如名称、Boat 名称等。

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

我可以使用NSSortDescriptor 排序键对直接属性进行排序,例如Captain name。但我需要按nameBoatCaptain 对象进行排序。

【问题讨论】:

请描述你为什么投反对票,否则我无法弥补。 我没有投反对票,但如果您发布一些您已经尝试过的代码并解释您当前代码的具体问题,将会很有帮助。 【参考方案1】:

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

[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 很有帮助地指出,如果您的查询页面通过数以千计的船长进行,则此答案无法很好地扩展。如果船长数量很大,最好包含一个船长指针并执行以下操作:

更迂回,你可以取船,按他们的名字排序,包括他们的船长(如果你的船有一个指向船长的反向指针),然后为他们的船长映射返回(排序)的船。

【讨论】:

直到对象太多为止。当您想要的只是以“a”开头的船名时,您不会想要获取 10000 多个对象。我认为您的反向指针建议是最理想的。您必须以两种方式设置指针,但可以更好地扩展。 @Logan - 不确定我是否同意。无论您是否在本地对它们进行排序,拉出数千个对象都是一个问题。如果有 10k 艘船,我的反向指针想法也将是一个糟糕的想法。我认为无论如何我们都需要安排查询以返回合理的计数。 (parse 以 max limit=1000 强制执行此操作) 对,但是从船上查询,你不能分页吗?喜欢按船名排序的查询,包括关键船长。然后,您可以一次获得 100 个,并根据需要分页。否则,您需要获取所有船长对象以确保它们被船只准确分类。对吗? 好吧,我明白你的意思了。数据的设计应该与您将要执行的查询类型相匹配,如果您有 10k 艘船(一个疯狂的庞大海军)并且想要进行这种查询(或查找船长),您最好包含一个指针那样。 (已编辑)【参考方案2】:

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

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

【讨论】:

【参考方案3】:

对此有一个可扩展的解决方案,开销相当小: 当前,您有一张船表和一张船长表,其中每个船长都包含一个指向船的指针。

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

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

    查询“CaptainsBoats”,按任何排序。请注意,即使此表包含一百万条记录,您也会得到与您相关的第一个 X。

    查询“Captains”,将“containedIn”方法与第 1 步中的船列表一起使用:[captainQuery whereKey:"boat" containedIn:boatList]

    现在你只有你需要的船长对象(可能有一百万个)。根据任何内容在本地对它们进行排序。

【讨论】:

以上是关于通过指针解析排序查询的主要内容,如果未能解决你的问题,请参考以下文章

按指针的 objectId 对 Parse 结果进行排序

C 语言二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 通过 交换指针指向的内存数据 方式进行排序 )

List列表排序报空指针异常

通过指针获取解析对象

我可以使用 ObjectID 设置解析对象指针吗

通过元素指针的无序映射作为键对向量进行排序