1

我在 iOS 应用程序中使用 parse.com 将数据存储到解析云服务。我在查询嵌套对象时遇到问题。我有以下数据模型:

“游戏”类包含“赢家”

"winners" 是一个数组NSDictionary,字典中的每一项都是 1 个玩家到 N 个权力的映射

playerPowers 值是一个PFObjects 数组(权力目前只有一个名称),用于key:objectId的玩家(PFObject)

对于每个获胜者,我向“获胜者”(可以有多个获胜者)添加一个NSDictionary对象,如下所示:

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

对于字典中的每个项目,键是玩家的现有 objectId,值是PFObjects也在服务器上的 (powers) 数组。当我查询“获胜者”时,我想检索所有填充的数据、所有获胜者及其各自的权力PFObjects及其所有数据。当我查询“获胜者”时,每个权力的详细信息PFObject都不完整(key:name 的值为 null)。以下是查询,然后是打印结果的代码,然后是包含两个获胜者的字典的输出:

// 在vi​​ewWillAppear 中:

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

// 在tableview 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与其他 PFObjects(Powers 数组)相关的(Game)时,不会检索这些 Powers 的值。您将必须在后续获取请求中获取这些 Power 的所有值。

从解析文档:

默认情况下,在获取对象时,不会获取相关的 PFObject。这些对象的值在被获取之前无法检索,如下所示:

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

对 Fetch 与 Find 的说明:在 PFObjects (docs) 上调用 Fetches,而在 PFQueries ( docs )中使用 Finds 。

获取需要 PFObjects 作为输入,并且不返回任何内容。获取只是更新您已经从 Parse 检索到的 PFObjects 上的值。另一方面,Finds 将从 Parse 中检索 PFObjects。

由于您有一个 Powers 数组(它们是 PFObjects),请使用以下命令从 Parse 中检索所有值:

[PFObject fetchAllIfNeeded:(NSArray *)myPowers];

或者fetchAllIfNeededInBackground:,如果您希望它是异步的。

于 2013-01-19T00:07:59.183 回答
0
PFQuery *query = [PFQuery queryWithClassName:@"Cars"];
[query findObjectsInBackgroundWithBlock:^(NSArray *comments, NSError    *error) {
    for (PFObject *comment in comments)
    {
        PFObject *post = [comment objectForKey:@"name"];
        NSLog(@"%@",post);
于 2015-08-26T05:33:04.180 回答