Core Data 中一对多关系的正确 NSPredicate 格式

Posted

技术标签:

【中文标题】Core Data 中一对多关系的正确 NSPredicate 格式【英文标题】:The correct NSPredicate format for one-to-many relationship in Core Data 【发布时间】:2009-07-25 12:06:27 【问题描述】:

我有一个具有一对多关系的托管对象模型 A 和 B。

对于这个特定的任务,我想检索与 B 有关系且属性与“字符串”匹配的所有 A 对象。

我曾尝试过@"ALL bObjects.bProperty MATCHES 'string'",但它导致了 objc_exception_throw in:

[NSSQLGenerator generateSQLStatementForFetchRequest:ignoreInheritance:countOnly:]

似乎是什么问题?

谁能告诉我正确的谓词格式?

【问题讨论】:

【参考方案1】:

根据Predicate Programming Guide,在从Core Data SQL 存储中获取数据时,您不能使用MATCHES 运算符。

matches 运算符使用 regex,因此不受 Core Data 的 SQL 存储支持 - 尽管它确实适用于内存过滤。

至于您的谓词的其余部分,它目前只会返回A 对象,其中整个bObjects 集合具有与您的输入字符串匹配的bProperty

如果您想要返回任何 A 对象,这些对象在 bObjects 集中有任何匹配的对象,您可能需要使用 ANY 运算符修饰符。

ANY bObjects.bProperty LIKE[cd] 'string'

【讨论】:

【参考方案2】:

感谢您指出这些限制,是的,尽管我想相信文档,但我尝试了 MATCHES for SQLite fetch request,它确实有效,但为了安全起见我将其更改为 LIKE。

唯一不起作用的是,如果我在 Core Data 上使用此谓词,使用 SQLite 存储并在相关对象(在这种情况下为多对象)上请求获取请求,而不是使用匹配项。

目前,我没有使用基于关系的获取查询,风险太大,我仍然不知道是什么错误,我已经在devforums.apple.com上发布了这个,但是仍然没有人回答它。

【讨论】:

以上是关于Core Data 中一对多关系的正确 NSPredicate 格式的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 上的一对多关系

Core Data addObject 一对多关系

Core Data 获取请求与 NSFetchedResultsController 的一对多关系

在 Swift Core Data 中从一对多关系中获取对象

在 Core Data 中有效地获取一对多关系中的最新记录

如何处理 CORE DATA 中的一对多关系