【问题标题】:A query based on 2 other query results基于其他 2 个查询结果的查询
【发布时间】:2015-07-03 14:29:38
【问题描述】:

编辑 3: 好的,忘记之前的编辑,我终于弄清楚了!但我还有一个小问题。该查询查找并显示共享相同最爱食物的用户的用户名,然后显示他们的整个最爱食物数组。我的问题是,如何只显示与当前用户最喜欢的食物相同的最喜欢的食物?代码:

    PFQuery *query = [PFQuery queryWithClassName:@"_User"];
    [query whereKey:@"username" notEqualTo:[PFUser currentUser][@"username"]];
    [query whereKey:@"favouriteFood" containedIn:[PFUser currentUser][@"favouriteFood"]];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            for (PFObject *object in objects) {
                NSString *username = object[@"username"];
                NSArray *results = object[@"favouriteFood"];
                NSLog(@"Username: %@ Shared Favourite Food: %@", username, results);
            }
        }
        else {
            NSLog(@"O dang");
        }
    }];

这会显示与当前用户至少有 1 种共同喜爱的食物的用户,但随后会显示他们所有喜爱的食物,而不是常见的食物。

谢谢。

第一次发帖:

我正在尝试创建一个查询来获取当前用户的 query1(一个数组)的结果,然后使用 query2 在数据库中搜索在其数组中包含一个或多个相同数据的其他帐户。这是一个示例,可帮助您了解我要做什么:

用户可以将数据输入到数组中,我们称数组为favouriteFoodArray。输入到数组中的所有数据都保存到 Parse 的一行中,名为 favouriteFood。 现在,当前用户想要搜索分享相同喜欢的食物(至少一个数组条目相同)的其他用户。

所以我有 query1 来查找当前用户最喜欢的食物数组:

    PFUser *currentUser = [PFUser currentUser];
    PFQuery *favouriteFood = [PFQuery queryWithClassName:@"_User"];
    [favouriteFood whereKey:@"username" equalTo:currentUser.username];
    [favouriteFood findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            for (PFUser *object in objects) {
                self.usernameString = object.username;
                [self.results arrayByAddingObjectsFromArray:object[@"favouriteFood"]];
                NSLog(@"Username: %@, Favourite Food: %@", self.usernameString, self.results);
            }
        }
        else {
            NSLog(@"Error..");
        }

    }];

query2 然后去寻找所有用户最喜欢的食物,所以我们可以将 query1 结果与 query2 结果进行比较并显示至少有一个公共数组条目的人的用户名:

    PFQuery *allFavouriteFood = [PFQuery queryWithClassName:@"_User"];
    [allFavouriteFood findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
        if (!error) {
            for (PFUser *object in objects) {
                self.allUsernameString = object.username;
                [self.allFavouriteFoodArray arrayByAddingObjectsFromArray:object[@"favouriteFood"]];
                NSLog(@"Username: %@ Favourite Food: %@", self.allUsernameString, self.allFavouriteFoodArray);
            }
        }
    }];

现在,这两个查询工作,我遇到的问题是创建第三个查询来比较 query1 结果和 query2 结果。我试过使用:

...
[finalSearch whereKey:@"favouriteFood" containedIn:self.allFavouriteFoodArray];
...

但我遇到了一些奇怪的错误。我一直在努力解决这个问题。任何帮助是极大的赞赏。我希望我没有把这一切都复杂化。 谢谢。

编辑:

这是 query3 的示例:

    PFQuery *results = [PFUser query];
    [results whereKey:@"favouriteFood" containedIn:self.allFavouriteFoods];
    [results findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
    if (!error) {
        for (PFUser *object in objects) {
        self.allUsernameString = object.username;
        [self.favouriteFoodResults arrayByAddingObjectsFromArray:object[@"favouriteFood"]];
        NSLog(@"Username: %@ Shared Favourite Food: %@", self.otherUsernameString, self.allFavouriteFoodArray);
        }
    }
    else {
        NSLog(@"Error");
    }
}];

当我有 whereKey:containIn: self.allFavouriteFoods 时,我会遇到各种错误。 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: $in)'.

【问题讨论】:

  • 您不需要查询第一部分,您已经有了用户和食物数组。你也不应该使用queryWithClassName:@"_User",使用[PFUser query]。你为什么不在allFavouriteFood 上使用whereKey:containedIn:
  • @Wain 我已经解决了,谢谢。检查我的编辑。谢谢

标签: objective-c arrays parse-platform


【解决方案1】:

您的例外'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: $in)' 意味着您在提出请求时实际上没有要查找的食物清单。您应该调用当前用户的fetchIfNeededInBackgroundWithBlock: 以确保您有可用的食物清单 (allFavouriteFoods)。

一旦你有了它,即在完成块中,你搜索具有任何匹配食物的用户是正确的:

[results whereKey:@"favouriteFood" containedIn:self.allFavouriteFoods];

但你可以直接引用为:

[results whereKey:@"favouriteFood" containedIn:[PFUser currentUser][@"favouriteFood"]];

(假设当前用户在运行时总是有一些喜欢的食物)

【讨论】:

  • 谢谢,终于搞定了。我还有一个小问题,我在原帖中添加了。再次感谢韦恩。
  • 从食物数组中创建一个集合,每个用户只显示两个用户集合的交集
  • 我不太清楚该怎么做。我会做一些研究。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-24
  • 1970-01-01
相关资源
最近更新 更多