1

iOSアプリでparse.comを使用して、データを解析クラウドサービスに保存しています。ネストされたオブジェクトのクエリで問題が発生しました。私は次のデータモデルを持っています:

クラス「ゲーム」には「勝者」が含まれます

「勝者」はの配列でありNSDictionary、辞書の各項目は1プレイヤーからNパワーへのマッピングです。

playerPowers値は、プレーヤーのkey:objectId(PFObject) のPFObjectsの配列です(現在、パワーには名前しかありません)。

NSDictionary勝者ごとに、次のようなオブジェクトを「勝者」(複数の勝者が存在する可能性があります)に追加します。

NSDictionary * winnerWithPowers = [NSDictionary dictionaryWithObject:tempPowers
                                                forKey:[aWinnerPFObject objectId]];
[newGame addObject:winnerWithPowers forKey:@"winners"];

辞書の各項目について、キーはプレーヤーの既存のobjectIdであり、値はPFObjectsサーバー上の(パワー)の配列です。「勝者」を照会するとき、入力されたすべてのデータ、すべての勝者、およびすべてのデータを含むそれぞれのパワーを取得したいと思いPFObjectsます。「勝者」を検索すると、各パワーの詳細PFObjectが不完全です(key:nameの値がnullです)。次に、クエリ、結果を出力するコード、2つの勝者を含む辞書の出力を示します。

// viewWillAppearで:

PFQuery * gamesQuery = [PFQuery queryWithClassName:@"Game"];
[gamesQuery orderByDescending:@"createdAt"];
[gamesQuery findObjectsInBackgroundWithBlock:^(NSArray * theGames, NSError * error) {
    if (error) {
        NSLog(@"ERROR: There was an error with the Query for Games!");
    } else {
        _gamesPF = [[NSMutableArray alloc] initWithArray:theGames];
        [_tableView reloadData];
    }
}];

//テーブルビューのcellForRowAtIndexPath:メソッド(これは私自身のTableViewControllerです)

NSArray * testArray = [[_gamesPF objectAtIndex:row] objectForKey:@"winners"];
if ([testArray count] > 0) {
    // print contents of first dictionary winners entry
    NSLog(@"TestDictfromPF %@", [testArray objectAtIndex:0]);
}

ログ:

2013-01-18 09:42:26.430 GamesTourney[20972:19d03] TestDictfromPF {

jchtlqsuIY =     (
    "<Power:OlJfby1iuz:(null)> {\n}",  // problem is {\n}. Data exists on server but not in local structure after query
    "<Power:eQkMUThGOh:(null)> {\n}"   // ditto
);
}
4

2 に答える 2

8

PFObject他の PFObject (Power の配列) に関連する (Game)を取得する場合、それらの Power の値は取得されません。後続のフェッチ リクエストで、これらの Power のすべての値をフェッチする必要があります。

パースのドキュメントから:

デフォルトでは、オブジェクトを取得するときに、関連する PFObjects は取得されません。これらのオブジェクトの値は、次のようにフェッチされるまで取得できません。

PFObject *post = [fetchedComment objectForKey:@"parent"];
[post fetchIfNeededInBackgroundWithBlock:^(PFObject *object, NSError *error) {
  NSString *title = [post objectForKey:@"title"];
}];

Fetch と Find の明確化: Fetch は PFObjects ( docs ) で呼び出され、 Find は PFQueries ( docs )で使用されます。

フェッチには入力として PFObjects が必要であり、何も返しません。フェッチは、Parse から既に取得した PFObject の値を更新するだけです。一方、検索は、Parse から PFObjects を取得します。

Powers (PFObjects) の配列があるため、次を使用して Parse からすべての値を取得します。

[PFObject fetchAllIfNeeded:(NSArray *)myPowers];

またはfetchAllIfNeededInBackground:、非同期にしたい場合。

于 2013-01-19T00:07:59.183 に答える