2013年9月3日 星期二

第十課: APP的資料分享 --- ContentProvider


在 Android 的架構裡, 每個 App 就像是獨立的個體, 彼此不互相影響,
這樣做的好處是可以避免正常的程式被不正常的程式所影響,
但程式間的資料分享就成了一個問題.
ContentProvider 就是為了解決這個 App 間資料分享的問題而生的.

ContentProvider 的功用

ContentProvider 的目的是提供一個 App 間溝通的管道, 
所以它其實有兩個層面:
1. 提供資料給其他的 App 使用
2. 取得其他 App 提供的資料

在這邊不講解如何提供資料給其他 App 使用, 有需要的話可以看看這篇.
倒是我們比較可能需要取得其他 App 提供的資料, 下邊做個整理.

Android 提供的資源

Android 本身各個App提供的資源有:
鬧鐘 (AlarmClock),
通訊錄 (Contact),
行事曆 (Calendar),
相簿 (Photo),
影音列表 (MediaStore) ...等

如此一來, 開發者便能透過 Provider 來取得手機上的資料.

ContentProvider 取資料的範例 ---  以 Contacts 為例 (原始碼連結)

一.  註冊 permission, 取得Contacts 的使用權

 <uses-permission android:name="android.permission.GET_ACCOUNTS" />  
 <uses-permission android:name="android.permission.READ_CONTACTS" />  
 <uses-permission android:name="android.permission.WRITE_CONTACTS" />  

二. 透過 Provider 取得 cursor
cursor 是Android 裡用來取得資料的物件,  取得 cursor 後就能查找我們要的任一筆資料.
這裡的 getContacts() 是範例寫的一個方法,
projection 這個 String[] 要放我們想要的欄位名稱,
selection, selectionArgs 可以給 query 資料的條件, 設 null 就表示全選.

 private Cursor getContacts()  
   {  
     Uri uri = ContactsContract.Contacts.CONTENT_URI;  
     String[] projection = new String[] {  
         ContactsContract.Contacts._ID,  
         ContactsContract.Contacts.DISPLAY_NAME  
     };  
     String selection = null;  
     String[] selectionArgs = null;  
     String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";  
     return managedQuery(uri, projection, selection, selectionArgs, sortOrder);  
   }  

三. 使用SimpleCursorAdapter 取得 Adapter

這邊的 fields 是想取得資料欄位的名稱, layout.contact_entry 則是自定義的 layout.
取得 adapter 後, 再設給 ListView 就行了.

 String[] fields = new String[] {  
      ContactsContract.Data.DISPLAY_NAME  
 };  
 SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, cursor,  
         fields, new int[] {R.id.contactEntryText});  
 mList.setAdapter(adapter);  


範例(原始碼連結)

範例是取得通訊錄的內容, 做一個通訊錄的ListView



影片教學




沒有留言:

張貼留言