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
iphone NSPredicate 中的 Random() 子句排序