使用食谱,我想根据食谱中的项目而不是食谱名称查询(搜索)。
例如,多个项目可能包含鸡肉。我希望能够搜索鸡肉并查看食谱中含有鸡肉的食谱名称。
以下是我的尝试:
- (void)filterResults:(NSString *)searchTerm
{
PFQuery * query = [PFQuery queryWithClassName:self.parseClassName];
NSArray * ingredientArray = [self.profileObject objectForKey:@"ingredients"];
[query whereKey:searchTerm containedIn:ingredientArray];
[query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error) {
if (error)
{
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
else
{
[self.searchResults removeAllObjects];
[self.searchResults addObjectsFromArray:objects];
[self.searchDisplayController.searchResultsTableView reloadData];
}
}];
}
此代码不返回任何内容,我没有错误。
难以找到设置查询的正确方法。
这应该作为查询中的查询来解决吗?
含义:
首先通过成分查询,然后查询,根据之前包含searchTerm的食谱查询显示食谱名称。
答案 0 :(得分:2)
我认为您滥用[query whereKey:containedIn:]
方法。这用于查询所有PFObject,其中您指定的键的对象包含在您提供的数组中。除非您为每个食谱项目创建了一个新密钥,否则这不适用于您的目的,因为您的对象中没有一个具有“鸡”键。
首先,我建议您在Parse中使用RecipeIngredient
类,其中包含以下字段:
Recipe
对象的指针现在,您可以像这样查询RecipeIngredient
类:
PFQuery * query = [PFQuery queryWithClassName:"RecipeIngredient"];
[query whereKey:"ingredient" equalTo:searchTerm];
[query includeKey:"recipe"]; //Fetches the Recipe data via the pointer
[query findObjectsInBackgroundWithBlock:^(NSArray *recipeIngredientObjects, NSError *error) {
if (!error) {
NSArray *recipes = [recipeIngredientObjects valueForKey:@"recipe"];
//update table data as needed
} else {
// Log details of the failure
NSLog(@"Error: %@ %@", error, [error userInfo]);
}
}];
答案 1 :(得分:1)
去年我有这个问题,所以我想我会分享答案。
[query whereKey:@"ingredient" matchesRegex:searchTerm modifiers:@"i"];
那应该为你做。这有助于区分大小写。