標籤:android style blog color io os ar java 檔案
ContentProvider是Android的四大組件之一。
先說說我對這個東西的理解吧,ContentProvider就是用來存資料,用來共用資料的,比如:手機通訊錄的連絡人的資訊以及手機上面存的相片,視頻等等。
比較官方的解釋:
Android中的Content provider機制可支援在多個應用中儲存和讀取資料。這也是跨應用共用資料的方式之一,還有檔案,sharePreference,SQLite資料庫等方式儲存共用資料庫,但是ContentProvider更好的提供了資料共用介面的統一性。在android系統中,沒有一個公用的記憶體地區,供多個應用共用儲存資料。
先寫一個比較簡單實用的例子吧!
擷取通訊連絡人的列表
1.需要在AndroidManifest.xml檔案中允許讀取連絡人的資訊
<uses-permission android:name="android.permission.READ_CONTACTS"/>
2.然後建立一個Activity直接讀取資訊就行。
package zf.ui;import java.util.ArrayList;import java.util.List;import zf.adapter.ContactItemListAdapter;import zf.entity.ContactEntity;import zf.ui.R;import android.app.Activity;import android.database.Cursor;import android.os.Bundle;import android.provider.ContactsContract;import android.util.Log;import android.widget.ListView;public class ContactsActivity extends Activity {private ListView contactsList ;private List<ContactEntity> list = new ArrayList<ContactEntity>();@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.contacts_activity);contactsList = (ListView)findViewById(R.id.contacts_list);// 需要讀取的資訊列表(包括通訊錄的ID,通訊錄對應的姓名以及電話號碼)String []projecttion = {ContactsContract.CommonDataKinds.Phone.CONTACT_ID,ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,ContactsContract.CommonDataKinds.Phone.NUMBER};// 擷取ContentResolver對象,ContentResolver對象主要是用來擷取ContentProvider裡面的內容以及修改ContentProvider裡面的內容的// 擷取的資訊,儲存在Cursor中Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,projecttion, null, null, null);Log.d("zf",""+cursor.getCount());String name="";// 判斷存在資料顯示出來就顯示出來while(cursor.moveToNext()){ContactEntity contact = new ContactEntity();contact.setName(cursor.getString(1));contact.setPhonenum(cursor.getString(2));list.add(contact);}contactsList.setAdapter(new ContactItemListAdapter(ContactsActivity.this,list));}}
3.與之配套的還有還有一個填充資料的Adapter
package zf.adapter;import java.util.ArrayList;import java.util.List;import zf.entity.ContactEntity;import zf.ui.R;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;public class ContactItemListAdapter extends BaseAdapter {// 連絡人清單private List<ContactEntity> contactlist = new ArrayList<ContactEntity>();private Context mcontext;private LayoutInflater mlayout;public ContactItemListAdapter(Context context,List<ContactEntity> list){this.mcontext = context;mlayout = LayoutInflater.from(context);this.contactlist = list;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn contactlist.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn contactlist.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {// TODO Auto-generated method stubContactEntity contact = contactlist.get(position);ViewHolder holder = null;if(null == convertView){convertView = mlayout.inflate(R.layout.contact_item, null);holder = new ViewHolder();holder.name = (TextView) convertView.findViewById(R.id.name);holder.phonenum = (TextView) convertView.findViewById(R.id.num);convertView.setTag(holder);}else{holder = (ViewHolder) convertView.getTag();}holder.name.setText(contact.getName());holder.phonenum.setText(contact.getPhonenum());return convertView;}public class ViewHolder{public TextView imei;public TextView name;public TextView phonenum;}}
這裡有的一個問題是為什麼只有當連絡人的姓名和手機號都填了才顯示出來,否則不顯示出來。
例子2:自己寫一個ContentProvider可以供其他的應用調用裡面的資料
1.建立自己的ContentProvider(自己理解的,開機以後系統就會自動的開啟),需要繼承ContentProvider,比重載裡面的幾個方法
package zf.provider;import android.content.ContentProvider;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import android.net.Uri;public class MyProvider extends ContentProvider{private static final String sqlCreatInfo = "CREATE TABLE IF NOT EXISTS myInfo(ID Integer PRIMARY KEY,NAME Text,AGE Integer);";private SQLiteOpenHelper dataBaseOpenHelper;@Overridepublic boolean onCreate() {// TODO Auto-generated method stub// 建立一個資料庫表用來存資料dataBaseOpenHelper = new SQLiteOpenHelper(this.getContext(), null, null, 1, null) {@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// TODO Auto-generated method stub}@Overridepublic void onCreate(SQLiteDatabase db) {// TODO Auto-generated method stubdb.execSQL(sqlCreatInfo);}};return false;}@Overridepublic Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) {// TODO Auto-generated method stubSQLiteDatabase database = dataBaseOpenHelper.getReadableDatabase();return database.query("myInfo", projection, selection, selectionArgs, null, null, sortOrder);}@Overridepublic String getType(Uri uri) {// TODO Auto-generated method stubreturn null;}@Overridepublic Uri insert(Uri uri, ContentValues values) {// TODO Auto-generated method stubSQLiteDatabase database = dataBaseOpenHelper.getWritableDatabase();String str = database.getPath();database.insert("myInfo", "name", values);return null;}@Overridepublic int delete(Uri uri, String selection, String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}@Overridepublic int update(Uri uri, ContentValues values, String selection,String[] selectionArgs) {// TODO Auto-generated method stubreturn 0;}}
2.在AndroidManifest裡面註冊(在application下面),好像只有exported屬性為true,其他的應用才可以調用
<provider android:name="zf.provider.MyProvider" android:authorities="zf.provider.MyProvider" android:exported="true" > </provider>
3.建立另外一個應用,然後就可以調用了(調用的方法還是同上面的)
package zf.ui;import android.app.Activity;import android.content.ContentResolver;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.os.Bundle; import android.util.Log;public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);ContentResolver resolver = getContentResolver();Uri uri = Uri.parse("content://zf.provider.MyProvider/myInfo");//添加一條記錄ContentValues values = new ContentValues();values.put("ID", 1001);values.put("NAME", "zf");values.put("AGE", 18);resolver.insert(uri, values);Cursor cursor = resolver.query(uri, new String[]{"ID","NAME","AGE"}, null, null, null);while(cursor.moveToNext()){Log.d("zf", "" + cursor.getString(1));}}}
ContentProvider應該還有更多的應用,歡迎補充啊
Android之ContentProvider