Tips

AndroidTips | ContentProviderについて

ContentProviderについてもう少し

みなさん、こんにちは。
今さらですがContentProviderは御存知でしょうか?

ContentProviderはデータの共有に使用します。
データの共有とは、Aというアプリのデータベースの内容を、Bというアプリで呼び出すイメージです。
図にしてみました。
1

アプリ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の流れを図にしてみました。

1

大まかな流れは以下のようになります。

  1. 指定したテーブルからデータを抜き出して作成した表(Cursor)の先頭行に、moveToFirst()を用いて移動
  2. 値を取得し、ArrayListに追加
  3. moveToNext()で次の行に移動
  4. 値を取得し、ArrayListに追加
  5. 最終行に到達したら(moveToNext()の値がfalseになったら)終了

これまで複数Cursorについては触れてきました。
こちらも併せて確認してみてください。

Androidアプリ開発の必須知識!JAVAプログラミングを学べる連載リンク

はじめてのJAVA 連載

Recent News

Recent Tips

Tag Search