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については触れてきました。
こちらも併せて確認してみてください。
