编辑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)'
。
答案 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"]];
(假设当前用户在运行时总会有一些喜欢的食物)