心魅 - cocoromi -

半角スペース時々全角

ContentResolver.queryメソッドの第3に?を使っておくと、第4引数で展開出来る

android.content.ContentResolver.queryメソッドの各引数は、それぞれSQLのSELECT句や、FROM句に対応している。
第3引数はWHERE句にあたるが、中に?を埋め込んでおくと第4引数で展開することが出来る。


queryの参考文献などはこちらがいいんじゃないでしょうか。
ContentResolverで画像を読み込む | Android Techfirm Lab
公式 API Document


サンプル

サンプルとしてAndroid備え付けのContentStoreからMP3のファイル名で情報を引いてくる例をあげる。


まずは単純に埋め込む例。

        Cursor cursor = resolver.query(
        		MediaStore.Audio.Media.EXTERNAL_CONTENT_URI , 
        		new String[]{
        				MediaStore.Audio.Media.DISPLAY_NAME
        		},    // keys for select. null means all
        		"_display_name='"+f.getName()+"'" , 
        		null,
        		null
        );

これでもうまく行くような気はするが、f.getNameの戻り値をエスケープしたりしなければいけないし、場合によってはシングルクォートで囲わなくても良かったりして、めんどくさい。
そこで以下のように?埋込+第4引数を使う。

        Cursor cursor = resolver.query(
        		MediaStore.Audio.Media.EXTERNAL_CONTENT_URI , 
        		new String[]{
        				MediaStore.Audio.Media.DISPLAY_NAME
        		},    // keys for select. null means all
        		"_display_name=?" , 
        		new String[]{
        				f.getName()
        		},
        		null
        );


?を埋め込む場合は引用符など気にしなくていいし、エスケープも勝手にやってくれて楽で安全。


まとめ

queryメソッドの?埋込を使って安心クエリ生成。
っていうか?使わないとインジェクションされんぞ!!!