我看了其他问题,但我看到了一些答案,但都没有效果。
这是我的情况,我有两个对象“菜单”和“餐厅”。菜单是我拥有所有菜单项的地方,“餐厅”是不同餐厅的名称。因此:
菜单对象 - menuId - 名称 - 蛋白质 - restaurantID(一对一)
餐厅对象 - restaurantID(一对多) - 姓名
当用户给我餐馆名称时,我想返回菜单项。在SQL中,它将是:
SELECT * FROM ZMENU WHERE zrestaurantId = (SELECT Z_PK FROM ZRESTAURANT WHERE zname="Starbucks")
我试过
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *e = [[model entitiesByName] objectForKey:@"Restaurant"];
[request setEntity:e];
*NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(restaurant = (SUBQUERY(Restaurant, $x, $x.name like[cd] %@).@count))", restaurantName];
但是我收到了错误
'NSInvalidArgumentException', reason: 'Unable to generate SQL for predicate (restaurant == SUBQUERY(Restaurant, $x, $x.name LIKE[cd] "Starbucks").@count) (problem on RHS)'
有人可以帮忙吗?我想避免不得不做两次(一次用于餐馆PK,另一次用于菜单项),我相信应该有更合适的解决方案。
答案 0 :(得分:0)
我明白了!!!!!
创建元素是正确的,只需将子查询更改为
即可NSEntityDescription * e = [[model entitiesByName] objectForKey:@“Menu”]; [request setEntity:e];
NSString restaurantName = @“Starbucks”;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(restaurantId, $x, $x.name == %@).@count != 0", restaurantName];
因此子查询的工作方式是 - 通过设置实体来建立要获取的对象(在表上选择)。然后在谓词上使用引用外部表的字段上的子查询。然后在该表中指定要检查的字段,就是这样!我不知道为什么会有“计数”,但它确实有效。
按照每个文档的方式,在子查询中,您可以使用%@作为要检查的整数或字符串值,并且可以将%K用于要检查的字段名称。太酷了! :-D