2016-01-30 3 views
2

enter image description hereКакой NSPredicate следует использовать для фильтрации отношений Core Data в этом случае?

Выше мои отношения с основными данными. Это приложение для какао с тремя NSTableView, показывающими жанр, альбом и песню. Я хочу, чтобы фильтровать GenreArrayController, так что Жанр TableView только показывает название жанра, где Альбомы - длина песен> 4.

Когда я использую Predicate на SongArrayController:

[_songArrayController setFilterPredicate:[NSPredicate predicateWithFormat:@"length > 4"]]; 

Результат Жанр и Альбом остаются нефильтрованный но таблица Songs фильтруется. Доступен Жанр - Альбом - Песни с использованием NSPredicate on Genre.

Я делаю это неправильно, это можно достичь, изменив Сущности и их отношения.

+0

у меня не много опыта работы с предикатами, но вы, вероятно, необходимо установить фильтр по жанру ArrayController, и установить что-то вроде «ВСЕ albums.songs.length> 4». См. Синтаксис предиката: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-CJBDBHCB – fishinear

ответ

1

Вы можете комбинировать предикаты с && или используя более сложные словосочетания. Вы можете получить доступ к ключам отношений в вашем предикате через точечную нотацию. Таким образом, чтобы фильтровать песни по жанру:

NSPredicate(format: "length > 4 && album.genre = %@", genreObject) 

или даже

NSPredicate(format: "length > 4 && album.genre.name = %@", "Jazz") 
+0

Я хочу установить предикат на GenreArrayController не на SongArrayController. Когда я пытаюсь установить предикат с помощью точечного представления _ALL albums.songs.length> 4_ on Genre, я получаю сообщение об ошибке: '[<_NSFaultingMutableSet 0x608000039c20> addObserver: forKeyPath: options: context:] не поддерживается. Путь к ключу: songs.lenght' ** Может быть, потому, что я фильтрую объект отношений object ** – Napier

+0

Вы хотите, чтобы общее время воспроизведения всех песен одного альбома? Или все альбомы объединены? Или * по крайней мере одна * песня> 4? – Mundi

+0

Я хотел, чтобы в таблице Genre отображалось только название жанра, в котором количество песен было больше 4. Я решил это с помощью SubQuery. Я отправил ответ. – Napier

1

Использование подзапросов, я могу фильтровать Genre таким образом, что Genre таблица показывает только жанр, чей альбом содержит количество песен больше, чем 4 :

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(albums, $x, ANY $x.songs.count > 4)[email protected] != 0"]; 
+0

«Жанр, чей альбом содержит», невозможно. Может быть более одного альбома. – Mundi

+0

@Mundi, пусть будет два жанра, рок и джаз, каждый из которых имеет 5 альбомов. Я хочу, если ни один из альбомов в Rock или Jazz не имеет песен> 4, не показывайте это имя жанра в таблице. Над предикатом работало. Я должен переименовать длину для подсчета атрибута. – Napier

Смежные вопросы