今日學習任務:實現讀取手機中全部聯繫人的主要信息(名稱和聯繫電話),並以ListView顯示數據庫
涉及的主要內容:1) Contact API的結構和使用方法 2) ContentProvider組件做用,URI概念及使用方法 3)建立ListView,並綁定數據網絡
自Android 2.0(API Level 5)開始,Android平臺採用了改進後的Contacts API- ContactsContract,用於管理和集成來自多帳戶和多數據來源的聯繫人信息。ide
在新的Contacts API中,聯繫人數據被安排三個主要的表中:contacts, raw contacts and data. 結構以下圖所示:函數
1) Contact 表中的一行記錄表明一個聯繫人的整體信息學習
2) RawContact表的一行記錄用於關聯聯繫人和一個特定的聯繫人信息來源。由於有可能手機的聯繫人信息是來源於Gmail,Facebook等其它地方,爲互相區別並方便同步,特引入RawContact概念。url
3) Data表:儲存全部具體的信息,如:電話,email地址, 頭像等。表的每一條記錄對應一個RawContact的一個具體信息。blog
總的來講就是:一個contact(聯繫人)記錄關聯一個或多個RawContact(聯繫人來源)記錄,每一個RawContact記錄又關聯多個data(email, phone number等等)記錄。接口
在Android中,應用程序之間是相互獨立的,分別運行在本身的進程中。若是應用程序之間想互相共享數據怎麼辦?好比,當咱們發送一條短信時,可能要用到聯繫人應用程序,從中選擇要接受短信的人。在這種狀況下,Android提供了應用程序之間互相訪問的統一接口,這些接口被定義在ContentProvider中,其中包括增,刪,查,改等操做。進程
咱們在ContentProvider中實現咱們實際操做數據的方法。但調用時,咱們將使用另一個接口:ContentResolver。ContentResolver提供了和ContentProvider對應的方法。咱們是間接地經過ContentResolver來操做ContentProvider的。ContentResolver能夠經過getContentResolver()方法得到。圖片
Android 應用程序之間數據共享—ContentResolver
Android是如何實現應用程序之間數據共享的?一個應用程序能夠將本身的數據徹底暴露出去,外界更本看不到,也不用看到這個應用程序暴露的數據 是如何存儲的,或者是使用數據庫仍是使用文件,仍是經過網上得到,這些一切都不重要,重要的是外界能夠經過這一套標準及統一的接口和這個程序裏的數據打交 道,例如:添加(insert)、刪除(delete)、查詢(query)、修改(update),固然須要必定的權限才能夠。
如何將應用程序的數據暴露出去? Android提供了ContentProvider,一個程序能夠經過實現一個Content provider的抽象接口將本身的數據徹底暴露出去,並且Content providers是以相似數據庫中表的方式將數據暴露。Content providers存儲和檢索數據,經過它可讓全部的應用程序訪問到,這也是應用程序之間惟一共享數據的方法。要想使應用程序的數據公開化,可經過2種 方法:建立一個屬於你本身的Content provider或者將你的數據添加到一個已經存在的Content provider中,前提是有相同數據類型而且有寫入Content provider的權限。
如何經過一套標準及統一的接口獲取其餘應用程序暴露的數據?Android提供了ContentResolver,外界的程序能夠經過ContentResolver接口訪問ContentProvider提供的數據。
當前篇主要說明,如何獲取其它應用程序共享的數據,好比獲取Android 手機電話薄中的信息。 什麼是URI?
在學習如何獲取ContentResolver前,有個名詞是必須瞭解的:URI。URI是網絡資源的定義,在Android中賦予其更廣闊的含義,先看個例子,以下: URI 將其分爲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_URI ContentResolver 介紹說明
看完這些介紹,你們必定就明白了,ContentResolver是經過URI來查詢ContentProvider中提供的數據。除了URI以 外,還必須知道須要獲取的數據段的名稱,以及此數據段的數據類型。若是你須要獲取一個特定的記錄,你就必須知道當前記錄的ID,也就是URI中D部分。
前面也提到了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();