2014.02.18
AndroidTips | ContentProviderについて
ContentProviderについてもう少し
みなさん、こんにちは。
今さらですがContentProviderは御存知でしょうか?
ContentProviderはデータの共有に使用します。
データの共有とは、Aというアプリのデータベースの内容を、Bというアプリで呼び出すイメージです。
図にしてみました。
アプリAからアプリBに直接アクセスはできません。
アプリAはContentProviderを操作し、アプリB内のデータベースにアクセスします。
尚、アプリBの参照結果も同様に、ContentProviderを介して返ってきます。
今回はこのContentProviderの使い方を確認してみたいと思います。
ContentProviderの使い方
それでは電話帳のデータベースを取得するサンプルで確認してみましょう。
プログラムで大枠を確認
package com.example.contentprovider; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.ContactsContract.CommonDataKinds.Email; import android.view.View; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.Toast; public class MainActivity extends Activity implements OnItemClickListener { private List<String> emails = new ArrayList<String>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onResume() { super.onResume(); emails = new ArrayList<String>(); // getContentResolver()を用いて、ContentResolverオブジェクトを取得 ContentResolver resolver = getContentResolver(); Uri uri = Email.CONTENT_URI; // 抜き出すデータはメールアドレス String[] projection = new String[] { Email.DATA1 }; // メールアドレスが格納されている列のカラム名 String order = Email.DATA1 + " ASC"; // 抜き出してきたデータのCursor内での並び順 // 取得したContentResolverオブジェクトを用いて、Cursorオブジェクトを取得 Cursor c = resolver.query(uri, projection, null, null, order); if (c.moveToFirst()) { // c.moveToFirst()でCursorの先頭行に移動 // カラム名を引数にして、getColumnIndex()で値を取得 // 引数(=何番目にあるのか) int emailColum = c.getColumnIndex(Email.DATA1); do { emails.add(c.getString(emailColum)); // String型で取得した値を、ArrayListに追加 } while (c.moveToNext()); // c.moveToNext()で次の行に移動 } // Adapterの生成 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.textView1, emails); ListView listView = (ListView) findViewById(R.id.listView1); listView.setAdapter(adapter); listView.setOnItemClickListener(this); } @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Toast.makeText(this, emails.get(position), Toast.LENGTH_LONG).show(); } }
電話帳のデータを参照するにあたり、以下を確認してください。
38行目でUriオブジェクトを取得しています。
尚、上記プログラムではメールアドレスを取得しておりますが、他にも以下のような値が取得できます。
用途 | 値 |
---|---|
通話履歴を参照 | CallLog.Calls.CONTENT_URI |
電話番号を参照 | Phone.CONTENT_URI |
メールアドレスを参照 | Email.CONTENT_URI |
連絡先を参照 | Contacts.CONTENT_URI |
Cursorの操作の流れを確認
次にCursorの流れを図にしてみました。
大まかな流れは以下のようになります。
- 指定したテーブルからデータを抜き出して作成した表(Cursor)の先頭行に、moveToFirst()を用いて移動
- 値を取得し、ArrayListに追加
- moveToNext()で次の行に移動
- 値を取得し、ArrayListに追加
- 最終行に到達したら(moveToNext()の値がfalseになったら)終了
これまで複数Cursorについては触れてきました。
こちらも併せて確認してみてください。