是否有NSPredicate可以过滤具有一对多关系的模型(过滤多个对象)?

时间:2019-03-25 21:21:12

标签: 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])

但是在取得的结果上,我都收到了两张专辑,但我只想还给我《情歌2》。

你知道我该怎么做吗?

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

1 个答案:

答案 0 :(得分:3)

您需要使用SUBQUERY,因为仅当专辑的歌曲符合两个条件时,您才想包含该专辑。 (您的复合谓词将包括一张专辑,该专辑的一首歌曲与第一个条件匹配,而另一首歌曲与第二个条件匹配。

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