[Android 學習筆記] Content Provider 使用教學

內容提供者(Content Provider)是 Android 作業系統分享資料的機制,可以讓不同應用程式使用這些共享資料。其中一個常使用的情境就是共享 SQLite 的資料庫資料。

一、內容提供者基礎
內容提供者主要目的是分離儲存資料和實際使用資料的應用程式,以便提供 Android 作業系統和程式開發的方便性。

基本上內容提供者是在不同應用程式間分享資料的介面,一組封裝資料,提供標準的介面方便讀寫。例如:瀏覽器可以透過內容提供者存取非存在瀏覽器中的書籤,透過標準介面可以存取資料:insert()、update()、delete()、query()等方法,不用了解儲存的結構和方式。

二、系統內建的內容提供者
事實上,Android 系統中內建許多內容提供者來儲存一些共享資料,例如:聯絡人、瀏覽器書籤、通話記錄、媒體檔案等資料。我們可以使用 android.provider 套件的相關類別來存取內容提供者。例如:

ContactsContract:聯絡人相關資料,包含姓名、歷史、電話和Email
Browser:瀏覽器相關資料,包含書籤和瀏覽記錄
CallLog:通話相關資料,包含未接來電、已接來電、通話記錄
MediaStore:媒體檔案的相關資料,包含音樂、視訊和圖檔
Settings:裝置設定和使用者偏好設定相關資料

內容提供者 URI
內容提供者基本語法

content://<內容提供者名稱>/<資料路徑>/<記錄編號>
常見內容提供者範例:
1. content://contacts/people
2. content://browser/bookmarks
3. content://call_log/calls
4. content://media/internal/images
5. content://media/external/images

android.provider 套件的 URI 類別常數
在 Android SDK android.provider 提供 Helper Classes 的相關 URI 類別常數來代表上述URI查詢語法:

ContentContract.Contacts.CONTENT_URI
Browser.BOOKMARKS_URI
CallLog.CONTENT_URI
MediaStore.Images.Media.INTERNAL_CONTENT_URI
MediaStore.Images.Media.EXTERNAL_CONTENT_URI
亦可以替換為
Uri contacts = ContactsContract.Contacts.CONTENT_URI;
Uri contacts = Uri.parse("content://contacts/people");
如果需要查詢指定記錄,請使用 ContentUris.withAppendedId() 類別方法來新增記錄編號,即第二個參數值,第一個參數值是 URI 類別常數,例如:
Uri person = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, 2);

三、使用系統內容提供者取得電話
一般來說我們會比較常使用系統內建的內容提供者去取的資料,例如我們於 MainActivity 類別繼承 ListActivity 類別建立 ListView 元件,資料來源是內容提供者。

首先,建立 Uri 物件,例如:
Uri contacts = Uri.parse("content://contacts/people");
//使用URI類別常數的用法
Uri contacts = ContactsContract.Contacts.CONTENT_URI;
//使用Activity類別方法取得聯絡人資料的Cursor物件
Cursor c = getContentResolver().query(contacts, null, null, null);

getContentResolver() 方法取得 ContentResolver 物件,幫助我們解析 Uri 找到正確的內容提供者,透過 query() 方法執行查詢,五個參數說明
query()參數值依序為
1. Uri 物件
2. 欄位清單
3. 篩選條件
4. 參數篩選條件
5. 排序條件

取得內容後,我們需要建立欄位和介面元件的參數陣列對應,例如:
String [] columns = new String[] {
    ContactsContract.Contacts.DISPLAY_NAME,
    ContactsContract.Contacts._ID,
}

int[] views = new int[] {
    R.id.contactName,
    R.id.contactID
}

建立 SimpleCursorAdapter 結合器物件,例如:
SimpleCursorAdapter adapter = new SimpleCursor(this, R.layout.list_item, c, columns, views, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
setListAdapter(adapter);

四、使用系統瀏覽器書籤
與查詢聯絡人類似,我們同樣可以利用系統內建的內容提供者查詢瀏覽器的瀏覽記錄。

//建立瀏覽器URI物件
Uri uri = Uri.parse("Content://browser/bookmarks");
//建立URI物件後可以查詢內容提供者,運用query()方法查詢所要的欄位資料
String projection = {"_id", "title", "url"};
Cursor c = getContentResolver().query(uri, projection, null, null, null);
String str = "";
str += "書籤數量" + c.getCount() + "\n";
while(c.moveToNext()) {
    str += c.getString(1) + " -- ";
    String url = c.getString(2);
    str += url + "\n";
}

最後附上一個運用 Content Provider 取得瀏覽器書籤的範例,歡迎有興趣朋友可以參考。Github 範例下載

贊助本站 (Donate)