Android Contentproviderを使ってみる。
androidアプリの勉強中です。
今回はアンドロイドの4大要素のうち1つらしい、ContentProviderを使ってみました。
※ContentProviderのわかりやすい解説は他に十分あるので、自分の作業メモ的な感じで書きます。
ContentProviderとは。
データベースにデータを保存/取得できるクラス。
他のアプリとデータを受け渡す際に使うらしい。
ContentProvider | Android Developers
よく使う項目として、CommonDataKindsっていうクラスが用意されているそう。
連絡先データとかですね。
ContactsContract.CommonDataKinds | Android Developers
4大要素の1つというだけあって、
Content Provider自体なんてAPI Level 1だし、CommonDataKindsもAPI Level 5でAndroid2.0から対応なので、確かにAndroid初期からある仕組みとデータベースみたい。
うーん、でも自作アプリ作るとして、実際に使う機会あるかなぁ。
自分の作ったアプリから他のアプリにデータ受け渡すって多分ない。その場合、受け側のアプリも自分で作るしかないし。
他アプリとかデフォルトで定義されたデータベースを参照するのに使うことはある・・・かな?
あまり使うイメージわかないなぁ。
・連絡先データを取得してみる
とりあえず、連絡先データを参照するだけのアプリを作ってみることに。
・permissionの追加
適当な空のプロジェクトを作って、manifestにpermissionを追加します。
今回の連絡先参照だけなら上だけ。書き込みもするならWRITEもつけると。
<uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
・連絡先データを取得する。
まずは書いたコードそのものを載せます。
今回は、単純にcreateされた時にlogに「id数」「カラム数」「カラム名」を吐くだけのアプリにしました。
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //ContentResolverを設定 ContentResolver resolver = getContentResolver(); //クエリ(データを取り出すための操作)を作る。(ここで全データ取得してる) final Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null); //カーソルを移動(レコードの先頭に) cursor.moveToFirst(); final int id = cursor.getCount(); final int column_max = cursor.getColumnCount(); Log.d("TAG", "レコード数は==" +id); Log.d("TAG", "カラム数は==" +column_max); //全部のカラム名を取得するためにforで回す for(int i = 0; i<column_max-1;i++){ //カラム名を端から表示 Log.d("TAG","colum_number"+i+"=="+cursor.getColumnName(i)); //カーソルをひとつ先へ動かす cursor.moveToNext(); } } }
ポイントは2つですかね。
ContentProviderでデータを参照するために、ContentResolverというのを使ってます。ContentProviderとのデータのやりとり(参照/変更/更新)は全てContentResolverでおこないます。
その下、ContentResolver.queryメソッドでデータ自体を取得してます。
引数が5つありますが、最初の1個目でURIを指定します。
今回は、連絡先を取得したいので、ContactsContract.Contacts.CONTENT_URI。
2〜5個目の引数は、データ取得の条件(フィルタ的な感じ)を指定できるそうですが、全データ取得したいので、nullにしました。
戻り値はCursorオブジェクトになるので、Cursorオブジェクトcursorに渡します。
後は、cursorを動かしながらデータを取得していくだけですね。
操作はSQLみたいな感じですね。
・取得したデータを確認する
上記の書いた内容で、自分の手元にあった、2台の端末でカラム名を取得してみました。
column_name |
GalaxtS7edge_SVC33 Android 7.0 |
HTC J buttrfly HTL23 Android 5.0.2 |
androiddevelopers |
---|---|---|---|
sort_key | 0 | 0 | - |
link | 1 | - | - |
photo_uri | 2 | 1 | ◯ |
send_to_voicemail | 3 | 2 | ◯ |
contact_status | 4 | 5 | ◯ |
contact_status_label | 5 | 4 | ◯ |
pinned | 6 | 3 | ◯ |
link_type1 | 7 | - | - |
display_name | 8 | 6 | ◯ |
sec_custom_alert | 9 | - | - |
display_name_reverse | 10 | - | - |
phonebook_label_alt | 11 | 7 | - |
sec_custom_vibration | 12 | - | - |
phonebook_bucket | 13 | 8 | ◯ |
contact_status_res_package | 14 | 9 | ◯ |
photo_id | 15 | 11 | ◯ |
in_default_directory | 16 | 12 | ◯ |
_id | 17 | 13 | ◯ |
custom_ringtone | 18 | 14 | ◯ |
times_contacted | 19 | 15 | ◯ |
link_count | 20 | - | - |
phonebook_label | 21 | 16 | - |
lookup | 22 | 17 | ◯ |
display_name_alt | 23 | 18 | - |
phonetic_name | 24 | 19 | ◯ |
has_email | 25 | - | - |
sec_led | 26 | - | - |
last_time_contacted | 27 | 20 | ◯ |
contact_last_updated_timestamp | 28 | 21 | ◯ |
has_phone_number | 29 | 22 | ◯ |
in_visible_group | 30 | 23 | ◯ |
display_name_source | 31 | 26 | ◯ |
photo_file_id | 32 | 25 | - |
is_user_profile | 33 | 24 | ◯ |
contact_status_ts | 34 | 27 | - |
phonebook_bucket_alt | 35 | 28 | - |
sort_key_alt | 36 | 29 | - |
contact_presence | 37 | 30 | ◯ |
starred | 38 | 31 | ◯ |
photo_thumb_uri | 39 | 32 | ◯ |
contact_status_icon | 40 | 33 | ◯ |
contact_chat_capability | 41 | 34 | ◯ |
is_private | 42 | - | - |
dirty_contact | 43 | - | - |
phonetic_name_style | 44 | - | - |
custom_ledlight | - | 10 | - |
name_raw_contact_id | - | 35 | ◯ |
カラム数 | 44個 | 37個 | - |
column_name:取得できたカラム名
各端末の列に数字:column名の取得順番(ーはカラムなし)
android developer:AndroidDevelopersのContactsContract.Contactsのページ周辺で記載があったもの。(探し足りないだけで、他の場所に記載あるのかも。)
こうして比べてみると、この2台、端末差分なのか、Androidのver差分なのか、結構カラムが違いますね。
ここらへんってメーカの実装に任されてるんですかね。
余談ですが、、
SVC33の方で実機でテストした時、パーミッションに記載してるのに「パーミション書けバカ!」ってエラーがでて「え?」ってなったんですが、Android6.0以降は端末側でもアプリに権限許可する操作が必須になったんですって。
そういえば、新しいアプリ入れると権限許可求めるToast出てきますね。
そんな作り作るのも面倒そうだったんで、設定画面⇛アプリから、連絡先へのアクセスを許可して無事事なきを得ました。
・感想
なんかデータ構造ごちゃごちゃしててあんまり整理されてない印象だったけど、どうなんですかね。
実際に上で取得した項目、自分の連絡帳でデータの中身見てみても、全部nullで使ってなさそうな項目もあるし。
それとも、全てに深い意味があるけど、私のレベルが足りずに理解できてないだけなのかしらん。
ContentProvider周辺の作りがふわっと理解できたので今回はここまで。
ContentProviderでのデータ更新は削除は、やる機会なさそうなので割愛で。
まぁ同じような感じで出来そうだし。
Androidの機能関係は、いつか自由にアプリ開発できるようになることを目指して、今後も少しずつ勉強していく予定です。
今回はこのへんで!
Amazon Dash Buttonをいじってみてわかったこと
前回までの記事で、Amazon Dash ButtonでAmazonで買い物できるようにした(笑)わけなんですけど、その過程でわかったこと。
できることが少ない!!
Dash Buttonいじってネットワークと接続するボタンとして使うなんて記事は、検索すると沢山でてきます。
で、私もそれを見ていじってみたわけなんですが、、超単純な使い方しかできないんですね。
続きを読む