Android是如何實現應用程序之間數據共享的?一個應用程序能夠將本身的數據徹底暴露出去,外界更本看不到,也不用看到這個應用程序暴露的數據是如何存儲的,或者是使用數據庫仍是使用文件,仍是經過網上得到,這些一切都不重要,重要的是外界能夠經過這一套標準及統一的接口和這個程序裏的數據打交道,例如:添加(insert)、刪除(delete)、查詢(query)、修改(update),固然須要必定的權限才能夠。java
如何將應用程序的數據暴露出去? Android提供了ContentProvider,一個程序能夠經過實現一個Content provider的抽象接口將本身的數據徹底暴露出去,並且Content providers是以相似數據庫中表的方式將數據暴露。Content providers存儲和檢索數據,經過它可讓全部的應用程序訪問到,這也是應用程序之間惟一共享數據的方法。要想使應用程序的數據公開化,可經過2種方法:建立一個屬於你本身的Content provider或者將你的數據添加到一個已經存在的Content provider中,前提是有相同數據類型而且有寫入Content provider的權限。android
如何經過一套標準及統一的接口獲取其餘應用程序暴露的數據?Android提供了ContentResolver,外界的程序能夠經過ContentResolver接口訪問ContentProvider提供的數據。數據庫
當前篇主要說明,如何獲取其它應用程序共享的數據,好比獲取Android 手機電話薄中的信息。網絡
在學習如何獲取ContentResolver前,有個名詞是必須瞭解的:URI。URI是網絡資源的定義,在Android中賦予其更廣闊的含義,先看個例子,以下:
將其分爲A,B,C,D 4個部分:
A:標準前綴,用來講明一個Content Provider控制這些數據,沒法改變的;
B:URI的標識,它定義了是哪一個Content Provider提供這些數據。對於第三方應用程序,爲了保證URI標識的惟一性,它必須是一個完整的、小寫的 類名。這個標識在<provider> 元素的 authorities屬性中說明:
<provider name=」.TransportationProvider」 authorities=」com.example.transportationprovider」 . . . >
C:路徑,Content Provider使用這些路徑來肯定當前須要生什麼類型的數據,URI中可能不包括路徑,也可能包括多個;
D:若是URI中包含,表示須要獲取的記錄的ID;若是沒有ID,就表示返回所有;
因爲URI一般比較長,並且有時候容易出錯,切難以理解。因此,在Android當中定義了一些輔助類,而且定義了一些常量來代替這些長字符串,例如:People.CONTENT_URIapp
看完這些介紹,你們必定就明白了,ContentResolver是經過URI來查詢ContentProvider中提供的數據。除了URI之外,還必須知道須要獲取的數據段的名稱,以及此數據段的數據類型。若是你須要獲取一個特定的記錄,你就必須知道當前記錄的ID,也就是URI中D部分。ide
前面也提到了Content providers是以相似數據庫中表的方式將數據暴露出去,那麼ContentResolver也將採用相似數據庫的操做來從Content providers中獲取數據。如今簡要介紹ContentResolver的主要接口,以下:函數
返回值 | 函數聲明 |
final Uri | insert(Uri url, ContentValues values)Inserts a row into a table at the given URL. |
final int | delete(Uri url, String where, String[] selectionArgs)Deletes row(s) specified by a content URI. |
final Cursor | query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)Query the given URI, returning a Cursor over the result set. |
final int | update(Uri uri, ContentValues values, String where, String[] selectionArgs)Update row(s) in a content URI. |
看到這裏,是否感受與數據庫的操做基本同樣的?就是這樣的,詳細解析請參考Android SQLite解析篇中的說明,不在此詳細說明。學習
最後一個問題:如何獲取ContentResolver?調用getContentResolver (),例如:ContentResolver cr = getContentResolver();this
以上就徹底介紹瞭如何獲取、使用ContentResolver,啓動Eclipes,製做一個完整的實例以下:
打開showcontent.java,修改以下:url
package moandroid.showcontact; import android.app.ListActivity; import android.database.Cursor; import android.os.Bundle; import android.provider.Contacts.Phones; import android.widget.ListAdapter; import android.widget.SimpleCursorAdapter; public class showcontact extends ListActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Cursor c = getContentResolver().query(Phones.CONTENT_URI, null, null,null, null); startManagingCursor(c); ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, c, new String[] { Phones.NAME, Phones.NUMBER }, new int[] { android.R.id.text1, android.R.id.text2 }); setListAdapter(adapter); } }
而後在AndroidManifest.XML中<application>元素前增長以下許可:
<uses-permission android:name=」android.permission.READ_CONTACTS」 />
最後運行程序,在模擬器啓動後,單擊Menu返回到Home界面,打開Contacts選擇Contacts標籤頁,添加2個聯繫人信息。返回到Home,選擇moandroid.showcontact運行,剛添加的2個聯繫人信息將顯示在界面上,以下:
ContentResolver的使用極大的方便了應用程序之間共享數據,如何將應用程序的數據徹底暴露給給他應用程序使用了