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はオブジェクトへのポインタであるため、思い通りに機能しません。

このコードを実行すると、意図した結果が得られますが、実際の objectId を文字列として取得するには、2 つの API 要求を行う必要があります。

//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-request でこれを行う方法は? クラスのインスタンスをクエリでクラスのポインタと比較する方法は?

このようなことは私がやりたいことです:(疑似コード)

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

助言がありますか?

4

3 に答える 3

1

String型の列を追加してそれが指す objectID を格納する代わりに、オブジェクト自体を指すPointer型の列を各オブジェクトに追加することをお勧めします。これにより、追加する必要がある列の量が大幅に削減されます。唯一の欠点は、これを Cloud Code で行う必要があることです。

この質問のシナリオでは、次のような 2 つのクエリがあります。

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

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();
        }
    }
}
于 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 に答える