ContentResolver

3709 ワード

データはandroidではプライベートですが、ファイルデータやデータベースデータ、その他のタイプのデータも含まれています.では、2つのプログラムの間でどのようにデータ交換を行いますか?この問題を解決するのは主にContentProviderにかかっている.1つのContentProviderクラスは、他のアプリケーションがこのContent Providerの様々なデータ型を保存または読み出すことができるように、標準的なメソッドインタフェースのセットを実現します.すなわち,1つのプログラムはContentProviderの抽象インタフェースを実現することによって自分のデータを暴露することができる.外部からは見えないし、このアプリケーションが暴露したデータがアプリケーションにどのように格納されているのか、データベースで格納されているのか、ファイルで格納されているのか、ネットワークで格納されているのかを見る必要はありません.外部はこの標準と統一的なインタフェースを通じてプログラムの中のデータと付き合うことができて、プログラムの中のデータを操作することができます.
外部のプログラムはContentResolverインタフェースを介してContentProviderが提供するデータにアクセスでき、ActivityではgetContentResolverを介して親のContentResolverインスタンスを得ることができる.ContentResolverが提供するインタフェースは、ContentProviderで実装する必要があるインタフェースと対応しています.ContentResolverで該当するインタフェースにアクセスすると、ContentProviderは該当するインタフェースを実行し、結果を返します. 
アドレス帳を読み込むには、次の権限を設定します.
<uses-permission android:name="android.permission.READ_CONTACTS"/>

コードを少し説明すると、まずContentResolverを使用してすべての通信レコードのcursorをクエリーし、カスタムのCursorAdapterにCursorを転送し、AutoCompleteTextViewにバインドします.
package com.kevin.contentresolver;

import android.app.Activity;
import android.content.ContentResolver;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AutoCompleteTextView;
import android.widget.TextView;

public class Main extends Activity {
	private AutoCompleteTextView autoTextView;
	private TextView tv_result;
	private Cursor cursor;
	private ContactAdapter adapter;
	private ContentResolver resolver;
	//           
	public static final String[] PEOPLE_PROJECTION = {
		ContactsContract.Contacts._ID,
		ContactsContract.CommonDataKinds.Phone.NUMBER,
		ContactsContract.Contacts.DISPLAY_NAME
	};
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        autoTextView = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
        tv_result = (TextView)findViewById(R.id.tv_result);
        //   ContentResolver  
        resolver = getApplication().getContentResolver();
        //       Cursor
        /*
         *           content:// scheme URI
         *             ,       
         *       where  
         *           
         *         
         */
        cursor = resolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
        		PEOPLE_PROJECTION, null, null, null);
        //  cursor       ContactsAdapter
        adapter = new ContactAdapter(this, cursor);
        autoTextView.setAdapter(adapter);
        autoTextView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view, int position,
					long id) {
				//   Cursor
				Cursor c = adapter.getCursor();
				//          
				c.moveToPosition(position);
				String number = c.getString(c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Phone.NUMBER));
				//              
				number = number == null ? "     " : number;
				tv_result.setText(c.getString(c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME))
								  + "     " + number);
			}
		});
    }
}