parse.com:如何将指针键与对象进行比较?

我正在使用后端服务parse.com获取iOS应用程序,我在查询时遇到问题。 我需要帮助方法whereKey:matchesKey:inQuery;

我有这个代码:

//NOT WORKING PFQuery *query1 = [PFQuery queryWithClassName:@"Object"]; PFQuery *query2 = [PFQuery queryWithClassName:@"ObjectsRelations"]; [query2 whereKey:@"user" equalTo:[PFUser currentUser]]; [query1 whereKey:@"objectId" matchesKey:@"objectPointer" inQuery:query2]; [query1 findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { // No objects }]; 

它没有按照我想要的方式工作。 我已经尝试了几种方法来比较类“ObjectsRelations”(它是一个指向Object类实例的指针)中的键“objectPointer”和查询1中的实际Object。我没有得到任何对象,因为比较因为关键的objectId只是一个字符串而关键的objectPointer是一个指向Object的指针,所以它不能正常工作。

当我运行此代码时,我得到了预期的结果,但这需要我做两个api请求以将实际的objectId作为字符串!

 //WORKING PFQuery *query = [PFQuery queryWithClassName:@"Object"]; PFQuery *query2 = [PFQuery queryWithClassName:@"ObjectRelations"]; [query2 whereKey:@"user" equalTo:[PFUser currentUser]]; [query2 findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { PFObject *firstObject = [((PFObject*)[objects firstObject]) objectForKey:@"objectPointer"]; [query whereKey:@"objectId" equalTo:firstObject.objectId]; [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) { //Getting the objects correctly from the class Object! }]; }]; 

如何使用单个api请求执行此操作? 如何将类的实例与具有查询的类的指针进行比较?

这样的事情就是我想做的事:(伪代码)

 [query1 where:SELF matches:@"objectPointer" inQuery:query2]; 

有什么建议么?

我刚刚搜索了这个完全相同的问题,Parse论坛上有很多关于它的问题:

使用object_id进行嵌套查询时出现问题
协助关系查询
将查询中的字符串与指针进行比较,与查询中的键不匹配

第一个解释了在ObjectRelations类中包含一个额外字段(在本例中)的hack。 该键/字段将是一个字符串,它将是指针的objectId。 它将是保存指针的键/字段的补充。

如果你看一下这些问题就可以看出,到目前为止,Parse似乎没有直接回答这个问题。

我没有添加一个类型为String的附加列来包含它指向的objectID,我建议在每个对象上添加一个类型为Pointer的列来指向对象本身。 这将大大减少您必须添加的列数量。 唯一的缺点是必须在Cloud Code上完成。

在这个问题的情况下,你将有两个问题,如:

 //Inner query //Library containing pointer & pointer PFQuery * subscriptions = [PFQuery queryWithClassName:@"subscription"]; [subscriptions whereKey:@"User" equalTo:[PFUser currentUser]]; //Outer query //Pull down a list of deckStore objects not included in the subscriptions for current user PFQuery * decks = [PFQuery queryWithClassName:@"deckStore"]; 

而不是:

 [decks whereKey:@"objectId" doesNotMatchKey:@"deckString" inQuery:subscriptions]; 

你可以这样做:

 [decks whereKey:@"this" doesNotMatchKey:@"deck" inQuery:subscriptions]; 

以下是应添加Cloud Code的示例:

 Parse.Cloud.afterSave("Deck", function(request) { var deck = request.object; // To make sure this is the first time of "afterSave" of this object. if (deck.createdAt.getTime() == deck.updatedAt.getTime()) { // "this" is the column which contains the pointer of the object itself. if (deck.get("this") == null) { deck.set("this", deck); deck.save(); } } } 

我也有同样的问题。 这是我的解决方案:

 PFQuery *query1 = [PFQuery queryWithClassName:@"tableClass"]; [query1 whereKey:@"objectId" equalTo:[(PFObject *)[object objectForKey:@"pointerField"] objectId]]; PFObject *obj1 = [query1 getObjectWithId:[(PFObject *)[object objectForKey:@"pointerField"] objectId]]; NSString *pointerName = [obj1 objectForKey:@"name"];