Android中ContentProvider組件詳解

來源:互聯網
上載者:User

ContentProvider(內容提供者)是Android中的四大組件之一。主要用於對外共用資料,也就是通過ContentProvider把應用中的資料共用給其他應用訪問,其他應用可以通過ContentProvider對指定應用中的資料進行操作。ContentProvider分為系統的和自訂的,系統的也就是例如連絡人,圖片等資料。

 

以下這段是Google Doc中對ContentProvider的大致概述。
內容提供者將一些特定的應用程式資料供給其它應用程式使用。資料可以儲存於檔案系統、SQLite資料庫或其它方式。內容提供者繼承於ContentProvider 基類,為其它應用程式取用和儲存它管理的資料實現了一套標準方法。然而,應用程式並不直接調用這些方法,而是使用一個 ContentResolver 對象,調用它的方法作為替代。ContentResolver可以與任意內容提供者進行會話,與其合作來對所有相關互動通訊進行管理。

 

1.ContentProvider
Android提供了一些主要資料類型的ContentProvider,比如音頻、視頻、圖片和私人通訊錄等。可在android.provider包下面找到一些Android提供的ContentProvider。通過獲得這些ContentProvider可以查詢它們包含的資料,當然前提是已獲得適當的讀取許可權。
主要方法:
public boolean onCreate() 在建立ContentProvider時調用
public Cursor query(Uri, String[], String, String[], String) 用於查詢指定Uri的ContentProvider,返回一個Cursor
public Uri insert(Uri, ContentValues) 用於添加資料到指定Uri的ContentProvider中
public int update(Uri, ContentValues, String, String[]) 用於更新指定Uri的ContentProvider中的資料
public int delete(Uri, String, String[]) 用於從指定Uri的ContentProvider中刪除資料
public String getType(Uri) 用於返回指定的Uri中的資料的MIME類型
*如果操作的資料屬於集合類型,那麼MIME類型字串應該以vnd.android.cursor.dir/開頭。
例如:要得到所有person記錄的Uri為content://contacts/person,那麼返回的MIME類型字串為"vnd.android.cursor.dir/person"。
*如果要操作的資料屬於非集合類型資料,那麼MIME類型字串應該以vnd.android.cursor.item/開頭。
例如:要得到id為10的person記錄的Uri為content://contacts/person/10,那麼返回的MIME類型字串應為"vnd.android.cursor.item/person"。

 

2.ContentResolver
當外部應用需要對ContentProvider中的資料進行添加、刪除、修改和查詢操作時,可以使用ContentResolver類來完成,要擷取ContentResolver對象,可以使用Context提供的getContentResolver()方法。

ContentResolver cr = getContentResolver();
ContentResolver提供的方法和ContentProvider提供的方法對應的有以下幾個方法。
public Uri insert(Uri uri, ContentValues values) 用於添加資料到指定Uri的ContentProvider中。
public int delete(Uri uri, String selection, String[] selectionArgs) 用於從指定Uri的ContentProvider中刪除資料。
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) 用於更新指定Uri的ContentProvider中的資料。
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) 用於查詢指定Uri的ContentProvider。

 

3.Uri
Uri指定了將要操作的ContentProvider,其實可以把一個Uri看作是一個網址,我們把Uri分為三部分。
第一部分是"content://"。可以看作是網址中的"http://"。
第二部分是主機名稱或authority,用於唯一標識這個ContentProvider,外部應用需要根據這個標識來找到它。可以看作是網址中的主機名稱,比如"blog.csdn.net"。
第三部分是路徑名,用來表示將要操作的資料。可以看作網址中細分的內容路徑。

 

下面是用ContentProvider讀取連絡人資料,屬於系統資料。完整代碼下載:android_contentprovider_system.rar

注意:這裡的連絡人操作有點亂,關鍵是我還不是很熟,SDK1.6和SDK2.1的連絡人操作很有很大不同,希望哪位大俠指點一下。

/**<br /> * MainActivity<br /> *<br /> * @author zuolongsnail<br /> */<br />public class MainActivity extends Activity {<br />private EditText nameET;<br />private EditText numberET;<br />private Button insertBtn;<br />private Button deleteBtn;<br />private Button queryBtn;<br />private ListView contentView;</p><p>@Override<br />public void onCreate(Bundle savedInstanceState) {<br />super.onCreate(savedInstanceState);<br />setContentView(R.layout.main);<br />nameET = (EditText) findViewById(R.id.name);<br />numberET = (EditText) findViewById(R.id.number);<br />insertBtn = (Button) findViewById(R.id.insert);<br />deleteBtn = (Button) findViewById(R.id.delete);<br />queryBtn = (Button) findViewById(R.id.query);<br />// 用於顯示資料<br />contentView = (ListView) findViewById(R.id.content);<br />insertBtn.setOnClickListener(new OperateOnClickListener());<br />deleteBtn.setOnClickListener(new OperateOnClickListener());<br />queryBtn.setOnClickListener(new OperateOnClickListener());<br />}</p><p>class OperateOnClickListener implements OnClickListener {<br />@Override<br />public void onClick(View v) {<br />String name = nameET.getText().toString();<br />String number = numberET.getText().toString();<br />Person p = new Person(name, number);<br />switch (v.getId()) {<br />// 插入資料<br />case R.id.insert:<br />insert(p);<br />view();<br />break;<br />// 刪除資料<br />case R.id.delete:<br />delete(name);<br />view();<br />break;<br />// 查詢資料<br />case R.id.query:<br />view();<br />break;<br />}<br />}<br />}</p><p>// 顯示資料<br />private void view() {<br />Cursor c = query("");<br />ListAdapter listAdapter = new SimpleCursorAdapter(this, R.layout.list,<br />c, new String[] { People._ID, People.NAME, People.NUMBER },<br />new int[] { R.id.id, R.id.name, R.id.number });<br />contentView.setAdapter(listAdapter);<br />}</p><p>// 插入連絡人<br />private void insert(Person p) {<br />// 獲得ContentResolver對象<br />ContentResolver cr = getContentResolver();<br />ContentValues values = new ContentValues();<br />values.put(People.NAME, p.name);<br />// 表示是否把連絡人添加到收藏(加星),1表示加入,0表示不加入,這行代碼注釋預設是不加入。<br />values.put(Contacts.People.STARRED, 1);<br />Uri uri = Contacts.People.createPersonInMyContactsGroup(cr, values);<br />// 獲得連絡人People表的Uri<br />Uri url = Uri.withAppendedPath(uri,<br />Contacts.People.Phones.CONTENT_DIRECTORY);<br />values.clear();<br />values.put(Contacts.Phones.TYPE, Contacts.Phones.NUMBER);<br />values.put(Contacts.Phones.NUMBER, p.number);<br />// 插入操作<br />cr.insert(url, values);<br />}</p><p>// 插入連絡人<br />private void delete(String name) {<br />// 獲得ContentResolver對象<br />ContentResolver cr = getContentResolver();<br />Uri url = Contacts.People.CONTENT_URI;<br />// 設定刪除條件<br />String where = People.NAME + "=?";<br />String[] selectionArgs = { name };<br />cr.delete(url, where, selectionArgs);<br />}</p><p>// 查詢連絡人<br />private Cursor query(String name) {<br />// 獲得ContentResolver對象<br />ContentResolver cr = getContentResolver();<br />Uri uri = Contacts.People.CONTENT_URI;<br />// 查詢對象<br />String[] projection = { People._ID, People.NAME, People.NUMBER };<br />// 設定查詢條件,這裡我把selection和selectionArgs參數都設為null,表示查詢全部資料<br />String selection = null;<br />String[] selectionArgs = null;<br />if (!"".equals(name)) {<br />selection = People.NAME + "=?";<br />selectionArgs = new String[] { name };<br />}<br />// 設定排序條件<br />String sortOrder = Contacts.People._ID;<br />Cursor c = cr.query(uri, projection, selection, selectionArgs,<br />sortOrder);<br />// if (c.moveToFirst()) {<br />// for (int i = 0; i < c.getCount(); i++) {<br />// c.moveToPosition(i);<br />// String name = c.getString(c.getColumnIndexOrThrow(People.NAME));<br />// String number = c.getString(c<br />// .getColumnIndexOrThrow(People.NUMBER));<br />// }<br />// }<br />return c;<br />}<br />}

程式: 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.