NSPredicate ALL 与 SQLite 存储聚合

Posted

技术标签:

【中文标题】NSPredicate ALL 与 SQLite 存储聚合【英文标题】:NSPredicate ALL Aggregate with SQLite Store 【发布时间】:2011-05-18 10:38:49 【问题描述】:

我有一个名为 Attachment 的实体,它有一对多关系,没有反向关系。

我正在尝试定位其downloaded 属性为NO 关系名称为attachments 的所有附件实体,我编写了以下谓词来执行此操作。

[NSPredicate predicateWithFormat:@"ALL attachments.downloaded == NO"]

导致*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unsupported predicate (null)'

这只发生在 SQLite 存储上,如果我将存储更改为二进制,它似乎工作正常。我宁愿坚持使用 SQLite 商店。

有什么想法吗?无论如何要以不同的方式编写谓词以达到相同的预期结果?

【问题讨论】:

【参考方案1】:

这可能已经过时了,但仍然有人可能会发现答案很有用。

目前,使用 SQLite 作为后端存储的核心数据不支持 ALL 修饰符。听起来很简单,这就是为什么您可以使用它来过滤内存中的数组以获得所需的结果。

我认为这是由于其“难以实施”。对于 SQLite 而言,它对修饰符指定的条件语句实现了除法运算。但是,NSPredicate 并不限制您将其用作 NSCompoundPredicate 的一部分,从而增加了 SQL 生成器生成 SQL 语句的难度。

【讨论】:

感谢您提供这个非常有帮助的答案!您对如何使用子查询或其他方法构造ALL 有什么想法吗?【参考方案2】:

您的架构描述有点不清楚,但我相信您只想使用谓词对附件实体执行提取...

[NSPredicate predicateWithFormat:@"downloaded == NO"]

你试过了吗?

我可能完全错了^_^

【讨论】:

是的,这可行,但我正在寻找一种方法来获取需要按实体下载的附件列表。因此,如果我有一个名为 Document 的实体,它有附件,我想要一个方法,我可以将实体名称“Document”传递给并获取需要为该实体下载的附件的列表。抱歉,我的问题并不完全清楚。【参考方案3】:

我现在似乎找到了解决办法...

attachmentRequestResults = [self.managedObjectContext executeFetchRequest:attachmentIdRequest error:&error];
attachmentPredicate = [NSPredicate predicateWithFormat:@"ALL attachments.downloaded == NO"];
attachmentRequestResults = [attachmentRequestResults filteredArrayUsingPredicate:attachmentPredicate];

我删除了 fetchrequest 的谓词,以便它返回所有实体,然后我在返回的数组上运行我的谓词

仍在寻找可以针对 Core Data 执行谓词的解决方案

【讨论】:

以上是关于NSPredicate ALL 与 SQLite 存储聚合的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:使用 SQLITE 存储类型时,包含对多关系的 NSPredicate 不会产生任何结果

具有多对多关系的核心数据 - 在 SUBQUERY 中使用 ALL 创建 NSPredicate

NSPredicate:如何将字符串视为数字?

iphone NSPredicate 中的 Random() 子句排序

NSPredicate,CoreData 中的空格。如何修剪谓词?

使用 JOIN 访问 NSPredicate 中的核心数据实体关系