【问题标题】:Creating NSPredicate for external primary key为外部主键创建 NSPredicate
【发布时间】:2012-12-13 23:30:50
【问题描述】:

我查看了其他问题,并看到了一些答案,但没有一个有用。

这是我的情况,我有两个对象“菜单”和“餐厅”。菜单是我拥有所有菜单项的地方,“餐厅”是不同餐厅的名称。因此:

菜单对象 - 菜单标识 - 姓名 - 蛋白质 - 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,另一次用于菜单项),我相信应该有更合适的解决方案。

【问题讨论】:

    标签: ios subquery nsfetchrequest


    【解决方案1】:

    我明白了!!!!!!

    创建元素是正确的,只需将子查询更改为

    NSEntityDescription *e = [[模型实体ByName] objectForKey:@"Menu"]; [请求 setEntity:e];

    NSString restaurantName = @"星巴克";

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(restaurantId, $x, $x.name == %@).@count != 0", restaurantName];
    

    所以子查询的工作方式是——你通过设置实体来建立你想要获取的对象(在表上选择)。然后在谓词上,您对引用外部表的字段使用子查询。然后,您在该表中指定要检查的字段,就是这样!我不知道为什么会有“计数”,但它确实有效。

    顺便说一句,在子查询中,您可以将 %@ 用于要检查的整数或字符串值,并且可以将 %K 用于要检查的字段名称。很酷! :-D

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-09
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      相关资源
      最近更新 更多