如何在没有项目关系的情况下对对象进行核心数据查询?

时间:2011-11-24 07:04:57

标签: core-data nspredicate nsfetchrequest

假设我有一个名为“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 = ?
);

是否可以使用核心数据获取请求的谓词?

1 个答案:

答案 0 :(得分:2)

让我看看我是否做对了:

你有

  • Bucketname属性
  • Itemurl属性

和这样的关系

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}}索引。