ios - 是否有 NSPredicate 来过滤具有一对多关系的模型(过滤多个)?

标签 ios swift core-data nspredicate

我有两个模型:专辑和歌曲,专辑包含N首歌曲,但歌曲只包含1张专辑。我正在尝试创建一个特定的过滤器,但我找不到一个 NSPredicate 可以为我提供预期的结果。

我在 CoreData 上创建了两个模型:

"Album" "Song"

所以我创建了一些对象:

let song1 = Song(context: context)
song1.name = "I Love You"
song1.composer = "Ana"

let song2 = Song(context: context)
song2.name = "Hello And Goodbye"
song2.composer = "Ben"

let song3 = Song(context: context)
song3.name = "I Miss You"
song3.composer = "Marie"

let song4 = Song(context: context)
song4.name = "Lonely"
song4.composer = "Ana"

let album = Album(context: context)
album.name = "Love Songs 1"
let set = NSSet(array: [song1, song2, song3])
album.addToSong(set)

let album2 = Album(context: context)
album2.name = "Love Songs 2"
let set2 = NSSet(array: [song4])
album2.addToSong(set2)

所以,我想做这个过滤器:

获取 Ana 作曲且歌曲名称包含“n”的专辑

我使用以下谓词获取相册模型:

let composerPredicate = NSPredicate(format: "ANY song.composer = %@", "Ana")
let songPredicate = NSPredicate(format: "ANY song.name contains %@", "n")

let compoundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [composerPredicate, songPredicate])

但是在获取的结果中我得到了两张专辑,但我只想返回“Love Songs 2”。

你知道我该怎么做吗?

编辑1:我想找到一个不使用任何映射、过滤器或循环(如果可能的话)的解决方案,因为它直接影响性能,因为我处理了很多事情数据。

最佳答案

您需要使用 SUBQUERY,因为您只想包含专辑中包含符合这两个条件的歌曲的专辑。 (您的复合谓词将包括一张专辑,其中包含一首符合第一个条件的歌曲,以及另一首符合第二个条件的歌曲)。

let predicate = NSPredicate(format: "SUBQUERY(song, $S, $S.composer == %@ AND $S.name contains %@).@count > 0", “Ana”, "n")

关于ios - 是否有 NSPredicate 来过滤具有一对多关系的模型(过滤多个)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55346575/

相关文章:

swift - 如何在 Swift 中获取磁盘标识符

ios - 无法使用类型为 "save"的参数列表调用 "(nil)'

ios - 确定视频文件的路径

ios - 如何通过 Storyboard强制标签适合并保持在同一行?

objective-c - 用手指触摸移动时防止 View 对象跳跃

swift - 将 GPUImage MultipleBlend 从 OBJ-C 转换为 Swift

ios - iOS 上的核心数据——对对象进行特定更改

core-data - 查询/过滤具有共同父级且不符合键值的核心数据实体

ios - 当 tableview 单元格在 xib 上时,如何对 tableview 进行约束。表格 View 在 Storyboard上

iOS 请求服务器一夜之间没有响应 RestKit