Как использовать sortDescriptor для атрибута в отношении ко многим

  1. У меня есть объект песни и объект списка воспроизведения.
  2. В плейлисте может быть несколько песен, и песни могут быть связаны с несколькими плейлистами.
  3. У меня есть объект ListToSongs, который поддерживает порядок, в котором песни были добавлены в список воспроизведения. Я не использую «Упорядоченное отношение» в ios5 (я знаю о его существовании и мне нужен больший контроль над моей моделью), и я сохраняю порядок в поле «sortOrder» в сущности PlayListToSong. Итак, схема моделируется как (имена отношений указаны в скобках ниже):

Песня (плейлисты) ‹‹----> (песня) ListToSong (плейлист) ‹---->> (песни) Список

Я хочу получить все песни для данного списка воспроизведения с помощью запроса на выборку.

Следующий запрос на ListToSong работает. Это извлекает все объекты PlayListToSong, и я могу использовать obj.song для получения объекта Song. Также возвращает данные, отсортированные по sortOrder. Хорошо работает. (Приведенные ниже фрагменты кода написаны с использованием MagicalRecord для краткости).

songFilter = [NSPredicate predicateWithFormat:@"playlist == %@", filterList];    
linkObjs = [FRListToSongs MR_findAllSortedBy:@"sortOrder" ascending:YES withPredicate:songFilter inContext:ctxt];

Следующий запрос объекта Song приводит к сбою. Если я удалю дескриптор сортировки и просто получу, он сработает. Итак, проблема связана с sortDescriptor «playlists.sortOrder», который пытается сортировать на основе атрибута в объекте ListToSongs.

songFilter = [NSPredicate predicateWithFormat:@"ANY playlists.playlist == %@", filterList];    
songs = [FRSong MR_findAllSortedBy:@"playlists.sortOrder" ascending:YES withPredicate:songFilter inContext:ctxt];

В простом SQL (приведенном ниже) я пытаюсь выполнить соединение между Song и ListToSong и упорядочить по полю "sortOrder".

SELECT DISTINCT 0, t0.Z_PK, t0.Z_OPT, t0.ZNAME, t0.ZSEQ FROM ZSONG t0 JOIN ZFRLISTTOSONGS t1 ON t0.Z_PK = t1.ZSONG  WHERE  t1.ZPLAYLIST = ? order by t1.ZSORTORDER

Как сопоставить приведенный выше SQL с синтаксисом coredata и указать правильный sortDescriptor?

Обратите внимание, что единственная проблема заключается в том, как получить в конце «order by t1.ZSORTORDER», поскольку я не могу правильно указать sortDescriptor. Запрос на выборку отлично работает без дескриптора сортировки.


person siasl    schedule 12.09.2012    source источник
comment
Для чего нужен журнал сбоев при использовании sortDescriptor?   -  person brynbodayle    schedule 14.09.2012
comment
ко многим ключ здесь не допускается. В этом есть смысл. playlists - это набор, и у него нет свойства sortOrder, но как тогда указать это свойство sortOrder?   -  person siasl    schedule 15.09.2012


Ответы (1)


Я, наконец, пошел дальше "Подхода 1", упомянутого выше в моем вопросе. Я получил объект ListToSong и использовал obj.song, чтобы получить связанный объект Song. Я использовал RelationshipKeyPathsForPrefetching для предварительной выборки объекта песни, связанного с объектом ListToSong.

person siasl    schedule 17.09.2012