ios - 为外部主键创建NSPredicate

标签 ios subquery nsfetchrequest

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

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

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

最佳答案

我知道了!!!!!

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

NSEntityDescription * e = [[模型实体名] objectForKey:@“Menu”];
[request setEntity:e];

NSString restaurantName = @“星巴克”;

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

因此,子查询的工作方式是-通过设置实体来建立要获取的对象(在表上选择)。然后在谓词上,在引用外部表的字段上使用子查询。然后,在该表中指定要检查的字段,仅此而已!我不知道为什么要有一个“计数”,但是它起作用了。

通过文档的方式,您可以在子查询中将%@用作要检查的整数或字符串值,并将%K用作要检查的字段名称。太酷了! :-D

关于ios - 为外部主键创建NSPredicate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13870405/

相关文章:

iOS:屏幕在调用 dismissModalViewController 后不再接收 Touches

ios - 类与键 fullName 的键值编码不兼容 - tableView

php - 使用 GROUP BY 和 ORDER BY 子句按降序打印记录

objective-c - 核心数据 : Keypath Error Not Found in Entity <NSSQLEntity Studies id=3>

ios - NSPredicate 'The left hand side for an ALL or ANY operator must be either an NSArray or NSSet'

ios - 通过扩展向协议(protocol)添加功能的原因是什么,为什么不把它放在协议(protocol)本身的定义中呢?

ios - 使用多个 NSURLSessiond 在后台获取时调用完成处理程序

mysql - SQL子查询逻辑困惑

mysql - 使用 SELECT 结果查询另一个表的行

ios 核心数据 : make sure object is deleted from data source