内容提供者—Content Provider(一)

   今天我主要是复习了一下内容的提供者contentProvier,为什么就内容的提供者呢?因为它为数据源提供的统一接口,通过contentProvider可以把程序内部的数据向外部程序公开,这样其他程序就可以访问他们并可以对它们操作。那为什么Android SDK要提供contentProvider来访问数据呢?

       很多程序内部的数据库文件都保存在私有数据库中,一般常规方法很难访问这些数据库。通过ContentProvider可以访问到。这让我想起了java中的private 的用法,我们都知道private把变量或者方法类什么给保护起来了,变成私有的了,java中通常是用getter和setter方法对它们进行访问。contentProvider有些类似,数据库是私有的数据,而ContentProvider就相当于getter和setter方法。  

      程序内的数据库结构可能很复杂,通过Content Provider可以给程序人员提供一个更加人性化的操作方式,而这些复杂操作基本隐藏在增删改查方法中。

     由于安全考虑,contentProvider设置了一些权限,只要程序提供了相应的ContentProvider,就可以访问了。

读取联系人信息

package com.example.contactcontentprovider_01;

import android.app.Activity;
import android.database.Cursor;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class MainActivity extends Activity {

	private ListView listView = null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		listView = (ListView)findViewById(R.id.listView);
		Cursor cursor = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
		SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1,
				cursor, new String[]{ContactsContract.Contacts.DISPLAY_NAME,ContactsContract.Contacts.DISPLAY_NAME_ALTERNATIVE}, 
				new int[]{android.R.id.text1});
		listView.setAdapter(adapter);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

接收SMS短信

package com.example.smscontentprovider_01;

import android.app.Activity;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ListView;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		ListView listView = (ListView)findViewById(R.id.listView);
		Cursor cursor = getContentResolver().query(Uri.parse("content://sms/inbox"), null, "address like ?", new String[]{"1%"}, null);
		SMSAdapter smsAdapter = new SMSAdapter(this, cursor);
		listView.setAdapter(smsAdapter);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

}

SMSAdapter.java

package com.example.smscontentprovider_01;

import android.content.Context;
import android.database.Cursor;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.TextView;

public class SMSAdapter extends CursorAdapter{

	private LayoutInflater layoutInflater;
	public SMSAdapter(Context context, Cursor c) {
		super(context,c);
		layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void bindView(View view, Context arg1, Cursor arg2) {
		// TODO Auto-generated method stub
		TextView tvPhoneNumber = (TextView)view.findViewById(R.id.tvPhoneNumber);
		TextView tvContent = (TextView)view.findViewById(R.id.tvContent);
		tvPhoneNumber.setText(arg2.getString(arg2.getColumnIndex("address")));
		tvContent.setText(arg2.getString(arg2.getColumnIndex("body")));
	}

	@Override
	public View newView(Context arg0, Cursor arg1, ViewGroup arg2) {
		// TODO Auto-generated method stub
		View view = layoutInflater.inflate(R.layout.item, null);
		return view;
	}

}

android SDK给系统程序添了ContentProvider,这样我们就可以通过这些代码来访问这些数据了。


最后不要忘了给他们加上相应的权限

你可能感兴趣的:(内容提供者—Content Provider(一))