NSPredicate 用于查询中的位置

Posted

技术标签:

【中文标题】NSPredicate 用于查询中的位置【英文标题】:NSPredicate for a where in query 【发布时间】:2013-04-11 07:40:49 【问题描述】:

设置

有一个核心数据对象foo 与另一个核心数据对象“bar”具有多对多关系。这个bar 有一个barid 类型为int32 的属性。

我有一个由 NSNumbers 表示的整数的 NSArray(我们将其命名为 intlist)。 我有一个 foo 对象。

问题

我需要知道有多少与此foo 实例相关的bar 对象具有包含在intlist 中的barid

我想我可以为此使用谓词。但是我的谓词应该有什么格式?在 SQL 中应该是 SELECT count(*) FROM fooBarLinkTable WHERE fooid = x AND barid IN intlist,但我不知道如何将该语句转换为谓词。

【问题讨论】:

用字典打印你的“数组”......然后很容易写谓词 【参考方案1】:

我相信你有一个反向关系 barfoo 并且 intlist 是 NSArray 或 NSNumber 对象的 NSSet 类型。如果是这样,请执行以下操作:

NSFetchRequest* request = [NSFetchRequest fetchRequestWithEntityName:@"bar"];
[request setPredicate:[NSPredicate predicateWithFormat:@"barid IN %@ && ANY relationshipToFoos == %@", intlist, foo]];
NSError* error = nil;
NSUInteger count = [[self.fetchedResultsController managedObjectContext] countForFetchRequest:request error:&error];

【讨论】:

只应注意(因为从问题中不清楚)intlist 必须是 NSNumber 对象的 NSArray(或 NSSet)。 C 整数数组在谓词中不起作用。 是的,当然。我假设这个。感谢您的注意。更新了答案。 我已经投了赞成票,我会在星期三回到办公室进行测试时接受。 intlist 是一个 NSArray。我会将其编辑到问题中。

以上是关于NSPredicate 用于查询中的位置的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate:与日期iOS的to-Many关系

NSPredicate 使用 OR 错误

CoreData:NSPredicate 按日期过滤

NSPredicate 查询/搜索

NSPredicate 获取具有 NSDate 日期范围内的日期属性的核心数据对象

NSPredicate 使用 CloudKit 进行不区分大小写的字符串搜索