基于2个其他查询结果的查询

时间:2015-07-02 09:08:08

标签: objective-c arrays parse-platform

编辑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 。输入到数组中的所有数据将保存到名为 favouriteFood 的行中的Parse中。 现在,当前用户想要搜索共享相同喜欢的食物的其他用户(至少一个数组条目相同)。

所以我有 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];
...

但是我遇到了一些奇怪的错误。我一直试图在aaaallll日做这件事。任何帮助是极大的赞赏。我希望我没有过分复杂这一切。 谢谢。

修改

以下是 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时,我会遇到各种各样的错误:containsIn:self.allFavouriteFoods。 'NSInvalidArgumentException', reason: '*** setObjectForKey: object cannot be nil (key: $in)'

1 个答案:

答案 0 :(得分: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"]];

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