4

我正在为 iOS 应用程序使用后端服务 parse.com,但无法正确查询它。我需要 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”中的键“objectPointer”(它是指向类 Object 实例的指针)与查询 1 中的实际对象进行比较。我没有得到任何对象,因为比较不能按我的意愿工作,因为键 objectId 只是一个字符串,而键 objectPointer 是指向对象的指针。

当我运行这段代码时,我得到了预期的结果,但这需要我执行两个 api-request 来获取实际的 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];

有什么建议么?

4

3 回答 3

2

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

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

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

如果您查看这些问题,您会发现到目前为止,Parse 似乎还没有直接给出关于此问题的答案。

于 2013-10-05T04:39:48.437 回答
1

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

这个问题的场景中,您将有两个查询,例如:

//Inner query
//Library containing pointer<Deck> & pointer<User>
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];

以下是应添加的云代码示例:

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();
        }
    }
}
于 2015-03-20T06:39:59.377 回答
0

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

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"];
于 2014-11-15T16:48:25.267 回答