NSPredicates 和双对 n 关系

Posted

技术标签:

【中文标题】NSPredicates 和双对 n 关系【英文标题】:NSPredicates and double to-n relationships 【发布时间】:2009-08-13 20:21:04 【问题描述】:

我有一个名为 Album 的核心数据实体;专辑与歌曲实体(称为歌曲)有关系,每首歌曲都有任意数量的标签实体(在标签属性中),标签有一个名称。 现在我想检查专辑中的歌曲是否包含标签;使用单个 NSPredicate。

想到的一个想法是:

[NSPredicate predicateWithFormat: @"ANY (ANY songs).tags LIKE %@", someTagName];

但这会在运行时导致错误(“无法解析格式字符串”)。我尝试了各种变体,但都没有成功。

有没有办法做到这一点?

【问题讨论】:

【参考方案1】:

我想你想要

[NSPredicate predicateWithFormat:@"ANY songs.@unionOfSets.tags LIKE %@", someTagName]

查看set and array operators 上的键值编程指南部分。

【讨论】:

听起来不错,我试过了,但又卡住了。这通常不会经常发生在我身上......现在我得到以下异常:***由于未捕获的异常'NSUnknownKeyException'而终止应用程序,原因:'[ valueForUndefinedKey:]:实体专辑不是键值编码兼容键“songs.@distinctUnionOfSets.labels”。我试了一圈,但我只是找不到可以放置@distinctUnionOfSets 而不会导致那种崩溃的地方。任何线索我做错了什么? @Julian 对不起,这是我没有测试就写的错。由于我没有可玩的 Core Data 项目,所以我正在努力工作。您是否尝试过@unionOfSets,而不是@distinctUnionOfSets?我总是与这些集合运算符有点挣扎。我经常不得不在 [album valueForKeyPath:@"@songs.tags"] 之类的行上放置一个断点,然后查看调试器中的结果。如果它是一组集合,那么 @unionOfSets.songs.tags 应该这样做。如果是别的东西,那么您需要适当地修改密钥路径。【参考方案2】:

只是一个想法,但也许 LIKE 在 iPhone 上不可用?我知道我在 BETWEEN 上遇到了困难,这似乎不起作用。

所以标签与歌曲没有多对多的关系?如果以这种方式建模,获取标签的歌曲将只涉及访问属性 tag.songs。您对其建模的方式似乎可以为每首歌曲复制标签(这在您的应用中可能很好)。

【讨论】:

以上是关于NSPredicates 和双对 n 关系的主要内容,如果未能解决你的问题,请参考以下文章

JS中的单引号和双引号

JS中的单引号和双引号

在 NSFetchRequest 上设置 2 个 NSPredicates

使用 NSPredicates 过滤 NSMutableArray

使用 2 个 NSPredicates?

如何使用两个 NSPredicates 获取请求 - Swift 2