parse.com: ¿Cómo comparar las teclas de puntero con los objects?

Estoy usando el service de back-end parse.com para una aplicación de iOS y tengo un problema para consultarlo correctamente. Necesito ayuda con el método whereKey: matchesKey: inQuery;

Tengo este código:

//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 }]; 

No funciona como yo quiero. He intentado varias forms para que compare la key "objectPointer" en la class "ObjectsRelations" (que es un puntero a una instancia de la class Object) al object real en la consulta 1. No recupero ningún object porque la comparación no funciona como quiero, ya que la key objectId es solo una cadena y la key objectPointer es un puntero a un object.

Cuando ejecuto este código, obtengo el resultado previsto, ¡pero esto requiere que hago dos api-requests para get objectId real como una cadena!

 //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! }]; }]; 

¿Cómo hacer esto con una única request de api? ¿Cómo comparar una instancia de una class con un puntero de una class con una consulta?

Algo así es lo que quiero hacer: (Pseudo Code)

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

¿Alguna sugerencia?

Acabo de search este mismo problema y hay varias preguntas en el foro de Parse:

Problema con una consulta anidada utilizando object_id
Asistencia con consulta relacional
Comparar cadena a puntero en consulta con no coincide con key en consulta

El primero explica un hack para include un campo adicional (en este caso) en su class ObjectRelations . Esta key / campo sería una cadena que sería el object Id del puntero. Sería además de la key / campo que contiene el puntero.

Si observas las preguntas, puedes ver que a partir de ahora no parece haber una respuesta directamente de Parse sobre esto.

En lugar de agregar una columna adicional con el tipo String para contener el objectID al que apunta, sugiero agregar una columna en cada object con el tipo Puntero para apuntar al object mismo. Esto networkinguciría drásticamente la cantidad de columnas que debe agregar. El único inconveniente es que esto debe hacerse en el código de la nube.

En el escenario de esta pregunta , tendrás dos consultas como:

 //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"]; 

Entonces en lugar de:

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

Puedes hacerlo:

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

Aquí hay una muestra de lo que debe agregar el Código de la nube:

 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(); } } } 

Tengo el mismo problema. Esta es mi solución:

 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"];