假设我有一个名为“Bucket”的核心数据实体。 Bucket具有名称和多对一关系,名为“items”,名为“Item”的实体,其具有属性“url”。业务规则要求具有给定URL的项目只能在存储桶中一次。 (旁白:我很喜欢Core Data中的正确约束!)这是我的问题:如何获取不包含具有给定URL的Item的存储桶?
IOW,我怎么能在核心数据中做相当于这个SQL?
SELECT name FROM buckets
WHERE bucket_id NOT IN (
SELECT bucket_id FROM items WHERE url = ?
);
是否可以使用核心数据获取请求的谓词?
答案 0 :(得分:2)
让我看看我是否做对了:
你有
Bucket
,name
属性Item
,url
属性和这样的关系
Bucket
< --->> Item
即。一个桶可以有多个项目,但每个项目只在一个桶中。
现在,您需要的是子查询表达式:
(SUBQUERY(items, $x, $x.url == %@).@count == 0)
即
NSString *urlAsString; // Assume we have this
NSPredicate *p = [NSPredicate predicateWithFormat:@"(SUBQUERY(items, $x, $x.url == %@).@count == 0)", urlAsString];
出于性能原因,您需要url
的{{1}}索引。