私はこのようなコアデータモデルを持っています:
そして、私は特定のスケジュールで劇場を上映しているすべての映画を照会しようとしています。
しかし、NSPredicateを使用してこのクエリを実行する方法がわかりません。
私はこれを試しました:
NSPredicate *moviesPredicate = [NSPredicate predicateWithFormat:@"SUBQUERY (movies, $x, $x.movies.showTimes == %@ AND $x.movies.theater.nameOfTheater == %@).@count >0", showTime, theater];
しかし、動作しませんでした。私が間違っていることを知っている人はいますか?
私は本当にあなたの助けに感謝します
私はあなたの述べた目的(「...特定のスケジュールで劇場を上映しているすべての映画をクエリする」)から、あなたのNSFetchRequestのエンティティはであると仮定していますMovies
。その場合、使用する属性名と関係名はすべて、そのエンティティに関連している必要があります。したがって、劇場名はによって与えられtheaters.nameOfTheater
、上映時間はになりますshowTimes.showTimes
。Schedules
与えられたものにはたくさんあるのでMovie
、あなたの述語は、showTimes.showTimes
あなたの要件に一致するものがある場合、映画を選択する必要があります。したがって、述語を記述する1つの方法は次のようになります。
NSPredicate *moviesPredicate = [NSPredicate predicateWithFormat:@"theaters.nameOfTheater == %@ AND (ANY showTimes.showTimes == %@)", theater, showTime];
または、ANY句をSUBQUERYとして書き換えることもできます。
NSPredicate *moviesPredicate = [NSPredicate predicateWithFormat:@"theaters.nameOfTheater == %@ AND SUBQUERY(showTimes, $x, $x.showTimes == %@).@count > 0", theater, showTime];
より広い推奨事項として、属性とエンティティの名前を変更します。それは物事をより明確にするのに役立ちます:
Movie
なくMovies
、でTheatre
はTheatres
ありSchedule
ませんSchedules
。theatre
はto-oneであるため関係があり、Scheduleエンティティmovies
はto-manyであるため関係があります。最後に、データモデルを改善できると思います。現在、各映画には1つの劇場しかありません。実際には、映画が複数の劇場で上映されることを想像します!個人的に、私はこのようなモデルを持っているでしょう:
各だからSchedule
一つだけに関係Movie
し、1 Theater
。しかし、それぞれTheater
に多くのshowings
があり、それぞれMovie
に多くのがありscreenings
ます。このモデルを使用すると、クエリを満たすための述語は次のようになります。
NSPredicate *moviesPredicate = [NSPredicate predicateWithFormat:@"SUBQUERY(screenings, $x, $x.theater.nameOfTheater == %@ AND $x.showTime == %@).@count > 0", theater, showTime];
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加