狠狠撸

狠狠撸Share a Scribd company logo
SUBQUERYを使って
CoreDataで対多関連を検索
@masaichi
自己紹介
? 市川 勝
? Twitter: @masaichi, github: @masarusanjp
? エンジニア (love obj-c, ruby)
? iOSアプリを仕事で開発してます
よろしくお愿いします
厂鲍叠蚕鲍贰搁驰とは?
CoreDataで、
あるエンティティの対多関連に対する
副問い合わせをするための構文
リファレンス
? NSExpression Class Referenceに書いてある
(not NSPredicate)
? https://developer.apple.com/library/ios/
documentation/cocoa/reference/
foundation/Classes/NSExpression_Class/
Reference/NSExpression.html
構文
SUBQUERY(
collection_expression,
variable_expression,
predicate
)
構文
[NSPredicate predicateWithFormat:@
SUBQUERY(
collection_expression,
variable_expression,
predicate
).@count == 0
];
構文
[NSPredicate predicateWithFormat:@
SUBQUERY(
collection_expression,
variable_expression,
predicate
).@count == 0
];
<- コレクションとして扱われる
例
アルバムと曲の関连について
レーティングが1以上、4以下
の曲を含むアルバムを検索
[NSPredicate predicateWithFormat:?
@ SUBQUERY(songs, ?
$s, ?
$s.rating >= 1 AND ?
$s.rating <= 4?
).@count > 0 ?
];
レーティングが1以上、4以下
の曲を含むアルバムを検索
[NSPredicate predicateWithFormat:?
@ SUBQUERY(songs, <- 関連の名前 ?
$s, ?
$s.rating >= 1 AND ?
$s.rating <= 4?
).@count > 0 ?
];
レーティングが1以上、4以下
の曲を含むアルバムを検索
[NSPredicate predicateWithFormat:?
@ SUBQUERY(songs, ?
$s, <- 条件内で使う変数名?
$s.rating >= 1 AND ?
$s.rating <= 4?
).@count > 0 ?
];
レーティングが1以上、4以下
の曲を含むアルバムを検索
[NSPredicate predicateWithFormat:?
@ SUBQUERY(songs, ?
$s, ?
$s.rating >= 1 AND ?
$s.rating <= 4?
).@count > 0 ?
];
レーティングが1以上、4以下
の曲を含むアルバムを検索
<- 条件
レーティングが1以上、4以下
の曲を含むアルバムを検索
[NSPredicate predicateWithFormat:?
@ SUBQUERY(songs, ?
$s, ?
$s.rating >= 1 AND ?
$s.rating <= 4?
).@count > 0 <- 評価 ?
];
なんで使うの?
础狈驰でも出来ないの?
レーティングが1以上、4以下
の曲を含むアルバムを検索
[NSPredicate predicateWithFormat:?
@ ANY songs.rating >= 1 AND ?
ANY songs.rating <= 4 ?
];
レーティングが1以上、4以下
の曲を含むアルバムを検索
SELECT DISTINCT 0, t0.Z_PK FROM ZALBUM t0?
JOIN ZSONG t1 ON t0.Z_PK = t1.ZALBUM?
JOIN ZSONG t2 ON t0.Z_PK = t2.ZALBUM?
WHERE ( t1.ZRATING >= ? AND t2.RATING <= ?)
[NSPredicate predicateWithFormat:?
@ SUBQUERY(songs, ?
$s, ?
$s.rating >= 1 AND ?
$s.rating <= 4?
).@count > 0 ?
];
レーティングが1以上、4以下
の曲を含むアルバムを検索
レーティングが1以上、4以下
の曲を含むアルバムを検索
SELECT 0, t0.Z_PK FROM ZALBUM t0
WHERE (
SELECT COUNT(t1.Z_PK) FROM ZSONG t1
WHERE (
t0.Z_PK = t1.ZALBUM AND
(( t1.ZRATING >= ? AND t1.ZRATING <= ?))
)
) > ?
まとめ
? SUBQUERYを使うと対多関連に対して、副問い
合わせが出来る
? 同じ関連に対する条件が複数ある場合、
SUBQUERYを使わないとうまくいかない
? 道具の1つとして状況に応じて使いましょう
? もっと良い表現があれば教えてください
サンプルコード
? https://github.com/masarusanjp/
CoreDataPredicateDemo
? 実行時引数に?
「-com.apple.CoreData.SQLDebug 1」?
をつけるとSQLが吐かれます
サンプルコード
? https://github.com/masarusanjp/
CoreDataPredicateDemo
? 実行時引数に?
「-com.apple.CoreData.SQLDebug 1」?
をつけるとSQLが吐かれます
ありがとうございました
Ad

Recommended

なぜ私はソニックガーデンのプログラマに転身できたのか?
なぜ私はソニックガーデンのプログラマに転身できたのか?
Junichi Ito
?
TDD のこころ
TDD のこころ
Takuto Wada
?
イマドキの贰虫肠别濒スクショの撮り方
イマドキの贰虫肠别濒スクショの撮り方
Yoshitaka Kawashima
?
奥别产アフ?リを并行开発する际のマイク?レーション戦略
奥别产アフ?リを并行开発する际のマイク?レーション戦略
Takayuki Shimizukawa
?
40歳过ぎてもエンジニアでいるためにやっていること
40歳过ぎてもエンジニアでいるためにやっていること
onozaty
?
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
?
RESTful Web アプリの設計レビューの話
RESTful Web アプリの設計レビューの話
Takuto Wada
?
うちの搁别诲尘颈苍别の使い方
うちの搁别诲尘颈苍别の使い方
Tomohisa Kusukawa
?
私にとってのテスト
私にとってのテスト
Takuto Wada
?
顿叠スキーマもバージョン管理したい!
顿叠スキーマもバージョン管理したい!
kwatch
?
プログラムの処方笺~健康なコードと病んだコード
プログラムの処方笺~健康なコードと病んだコード
Shigenori Sagawa
?
事例から探る、搁别诲尘颈苍别の机能とよりよい运用
事例から探る、搁别诲尘颈苍别の机能とよりよい运用
Go Maeda
?
骋辞のサーハ?サイト?実装におけるレイヤ设计とレイヤ内実装について考える
骋辞のサーハ?サイト?実装におけるレイヤ设计とレイヤ内実装について考える
pospome
?
GitHub ActionsでiOSのCIを実現しよう
GitHub ActionsでiOSのCIを実現しよう
Shinya Nakajima
?
JenkinsとDockerって何が良いの? ?言うてるオレもわからんわ? #jenkinsstudy
JenkinsとDockerって何が良いの? ?言うてるオレもわからんわ? #jenkinsstudy
Kazuhito Miura
?
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
?
搁别诲尘颈苍别の开発状况のこれまて?と现在
搁别诲尘颈苍别の开発状况のこれまて?と现在
Go Maeda
?
研究の基本ツール
研究の基本ツール
由来 藤原
?
厂飞补驳驳别谤て?の补辫颈开発よもやま话
厂飞补驳驳别谤て?の补辫颈开発よもやま话
KEISUKE KONISHI
?
Rails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱い
ota42y
?
础肠迟颈辞苍颁补产濒别のクライアントは搁补颈濒蝉外から利用できるのか
础肠迟颈辞苍颁补产濒别のクライアントは搁补颈濒蝉外から利用できるのか
Yoichi Toyota
?
搁别诲尘颈苍别によるメール対応管理の运用事例
搁别诲尘颈苍别によるメール対応管理の运用事例
Go Maeda
?
狈驳颈苍虫を使ったオレオレ颁顿狈の构筑
狈驳颈苍虫を使ったオレオレ颁顿狈の构筑
ichikaway
?
スマートフォンゲーム企画书制作のポイント
スマートフォンゲーム企画书制作のポイント
Tetsuya Kimura
?
Redmine にいろいろ埋め込んて?みた
Redmine にいろいろ埋め込んて?みた
Kohei Nakamura
?
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
?
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
?
ソーシャルゲームのためのデータベース设计
ソーシャルゲームのためのデータベース设计
Yoshinori Matsunobu
?
やはりお前らのCore Dataの使い方も間違っている
やはりお前らのCore Dataの使い方も間違っている
今城 善矩
?
厂迟辞谤测产辞补谤诲で鲍滨を使いまわす
厂迟辞谤测产辞补谤诲で鲍滨を使いまわす
Masaki Fuke
?

More Related Content

What's hot (20)

私にとってのテスト
私にとってのテスト
Takuto Wada
?
顿叠スキーマもバージョン管理したい!
顿叠スキーマもバージョン管理したい!
kwatch
?
プログラムの処方笺~健康なコードと病んだコード
プログラムの処方笺~健康なコードと病んだコード
Shigenori Sagawa
?
事例から探る、搁别诲尘颈苍别の机能とよりよい运用
事例から探る、搁别诲尘颈苍别の机能とよりよい运用
Go Maeda
?
骋辞のサーハ?サイト?実装におけるレイヤ设计とレイヤ内実装について考える
骋辞のサーハ?サイト?実装におけるレイヤ设计とレイヤ内実装について考える
pospome
?
GitHub ActionsでiOSのCIを実現しよう
GitHub ActionsでiOSのCIを実現しよう
Shinya Nakajima
?
JenkinsとDockerって何が良いの? ?言うてるオレもわからんわ? #jenkinsstudy
JenkinsとDockerって何が良いの? ?言うてるオレもわからんわ? #jenkinsstudy
Kazuhito Miura
?
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
?
搁别诲尘颈苍别の开発状况のこれまて?と现在
搁别诲尘颈苍别の开発状况のこれまて?と现在
Go Maeda
?
研究の基本ツール
研究の基本ツール
由来 藤原
?
厂飞补驳驳别谤て?の补辫颈开発よもやま话
厂飞补驳驳别谤て?の补辫颈开発よもやま话
KEISUKE KONISHI
?
Rails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱い
ota42y
?
础肠迟颈辞苍颁补产濒别のクライアントは搁补颈濒蝉外から利用できるのか
础肠迟颈辞苍颁补产濒别のクライアントは搁补颈濒蝉外から利用できるのか
Yoichi Toyota
?
搁别诲尘颈苍别によるメール対応管理の运用事例
搁别诲尘颈苍别によるメール対応管理の运用事例
Go Maeda
?
狈驳颈苍虫を使ったオレオレ颁顿狈の构筑
狈驳颈苍虫を使ったオレオレ颁顿狈の构筑
ichikaway
?
スマートフォンゲーム企画书制作のポイント
スマートフォンゲーム企画书制作のポイント
Tetsuya Kimura
?
Redmine にいろいろ埋め込んて?みた
Redmine にいろいろ埋め込んて?みた
Kohei Nakamura
?
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
?
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
?
ソーシャルゲームのためのデータベース设计
ソーシャルゲームのためのデータベース设计
Yoshinori Matsunobu
?
私にとってのテスト
私にとってのテスト
Takuto Wada
?
顿叠スキーマもバージョン管理したい!
顿叠スキーマもバージョン管理したい!
kwatch
?
プログラムの処方笺~健康なコードと病んだコード
プログラムの処方笺~健康なコードと病んだコード
Shigenori Sagawa
?
事例から探る、搁别诲尘颈苍别の机能とよりよい运用
事例から探る、搁别诲尘颈苍别の机能とよりよい运用
Go Maeda
?
骋辞のサーハ?サイト?実装におけるレイヤ设计とレイヤ内実装について考える
骋辞のサーハ?サイト?実装におけるレイヤ设计とレイヤ内実装について考える
pospome
?
GitHub ActionsでiOSのCIを実現しよう
GitHub ActionsでiOSのCIを実現しよう
Shinya Nakajima
?
JenkinsとDockerって何が良いの? ?言うてるオレもわからんわ? #jenkinsstudy
JenkinsとDockerって何が良いの? ?言うてるオレもわからんわ? #jenkinsstudy
Kazuhito Miura
?
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
onozaty
?
搁别诲尘颈苍别の开発状况のこれまて?と现在
搁别诲尘颈苍别の开発状况のこれまて?と现在
Go Maeda
?
研究の基本ツール
研究の基本ツール
由来 藤原
?
厂飞补驳驳别谤て?の补辫颈开発よもやま话
厂飞补驳驳别谤て?の补辫颈开発よもやま话
KEISUKE KONISHI
?
Rails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱い
ota42y
?
础肠迟颈辞苍颁补产濒别のクライアントは搁补颈濒蝉外から利用できるのか
础肠迟颈辞苍颁补产濒别のクライアントは搁补颈濒蝉外から利用できるのか
Yoichi Toyota
?
搁别诲尘颈苍别によるメール対応管理の运用事例
搁别诲尘颈苍别によるメール対応管理の运用事例
Go Maeda
?
狈驳颈苍虫を使ったオレオレ颁顿狈の构筑
狈驳颈苍虫を使ったオレオレ颁顿狈の构筑
ichikaway
?
スマートフォンゲーム企画书制作のポイント
スマートフォンゲーム企画书制作のポイント
Tetsuya Kimura
?
Redmine にいろいろ埋め込んて?みた
Redmine にいろいろ埋め込んて?みた
Kohei Nakamura
?
PlaySQLAlchemy: SQLAlchemy入門
PlaySQLAlchemy: SQLAlchemy入門
泰 増田
?
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
?
ソーシャルゲームのためのデータベース设计
ソーシャルゲームのためのデータベース设计
Yoshinori Matsunobu
?

Viewers also liked (10)

やはりお前らのCore Dataの使い方も間違っている
やはりお前らのCore Dataの使い方も間違っている
今城 善矩
?
厂迟辞谤测产辞补谤诲で鲍滨を使いまわす
厂迟辞谤测产辞补谤诲で鲍滨を使いまわす
Masaki Fuke
?
Company Scouter
Company Scouter
Shuichi Tsutsumi
?
Core dataと比較してrealmを使ったまとめ
Core dataと比較してrealmを使ったまとめ
Fumiya Sakai
?
iOS UI Component API Design
iOS UI Component API Design
Brian Gesiak
?
UIKit DynamicsとCoreMotionを組み合わせて物体を転がしてみた
UIKit DynamicsとCoreMotionを組み合わせて物体を転がしてみた
Kosuke Ogawa
?
Advanced Core Data
Advanced Core Data
Make School
?
技术选択とアーキテクトの役割
技术选択とアーキテクトの役割
Toru Yamaguchi
?
笔辞诲肠补蝉迟を支える技术、エンジニアのための奥别产メディア、そして颁笔础狈
笔辞诲肠补蝉迟を支える技术、エンジニアのための奥别产メディア、そして颁笔础狈
Yusuke Wada
?
IPAB2017 深層学習を使った新薬の探索から創造へ
IPAB2017 深層学習を使った新薬の探索から創造へ
Preferred Networks
?
やはりお前らのCore Dataの使い方も間違っている
やはりお前らのCore Dataの使い方も間違っている
今城 善矩
?
厂迟辞谤测产辞补谤诲で鲍滨を使いまわす
厂迟辞谤测产辞补谤诲で鲍滨を使いまわす
Masaki Fuke
?
Core dataと比較してrealmを使ったまとめ
Core dataと比較してrealmを使ったまとめ
Fumiya Sakai
?
iOS UI Component API Design
iOS UI Component API Design
Brian Gesiak
?
UIKit DynamicsとCoreMotionを組み合わせて物体を転がしてみた
UIKit DynamicsとCoreMotionを組み合わせて物体を転がしてみた
Kosuke Ogawa
?
技术选択とアーキテクトの役割
技术选択とアーキテクトの役割
Toru Yamaguchi
?
笔辞诲肠补蝉迟を支える技术、エンジニアのための奥别产メディア、そして颁笔础狈
笔辞诲肠补蝉迟を支える技术、エンジニアのための奥别产メディア、そして颁笔础狈
Yusuke Wada
?
IPAB2017 深層学習を使った新薬の探索から創造へ
IPAB2017 深層学習を使った新薬の探索から創造へ
Preferred Networks
?
Ad

颁辞谤别顿补迟补て?の蝉耻产辩耻别谤测の使い方