- Song Entity と Playlist Entity があります。
- プレイリストには複数の曲を含めることができ、曲は複数のプレイリストにリンクできます。
- プレイリストに追加された曲の順序を維持する ListToSongs エンティティがあります。私はios5で「Ordered Relationship」を使用していません(その存在を認識しており、モデルをより詳細に制御する必要があります)、PlayListToSongエンティティの「sortOrder」フィールドで順序を保存します。したがって、スキーマは次のようにモデル化されます (関係名は以下の括弧内に記述されています)。
曲 (プレイリスト) <<----> (曲) ListToSong (プレイリスト) <---->> (曲) リスト
フェッチ要求を使用して、特定の PlayList のすべての曲を取得したいと考えています。
ListToSong に対する次のクエリは機能します。これにより、すべての PlayListToSong obj が取得され、obj.song を使用して Song オブジェクトを取得できます。同様に、sortOrder でソートされたデータを返します。うまくいきます。(以下のコード スニペットは、簡潔にするために MagicalRecord を使用して記述されています)。
songFilter = [NSPredicate predicateWithFormat:@"playlist == %@", filterList];
linkObjs = [FRListToSongs MR_findAllSortedBy:@"sortOrder" ascending:YES withPredicate:songFilter inContext:ctxt];
Song エンティティに対して次のクエリを実行すると、クラッシュが発生します。ソート記述子を削除してフェッチすると、機能します。そのため、ListToSongs エンティティの属性に基づいて並べ替えようとしている sortDescriptor "playlists.sortOrder" に問題があります。
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 を与えるにはどうすればよいですか?
sortDescriptor を正しく指定できないため、唯一の問題は、最後に「t1.ZSORTORDER による順序」を取得する方法であることに注意してください。フェッチ要求は、ソート記述子がなくても正常に機能します。