android Content Provider

Provider數據類型
Contentproviders能識別多種不同的數據類型.用戶詞典隻識別文本類型,但其它provider可以識別下列格式:

整型

長整型(long)

浮點

長浮點(double)

另一個provider經常使用的數據類型是"大二進對象"(BLOB) ,它就像一個64KB的字節數組.你可以通過Cursor類的"get"方法查看可用的數據類型.

provider中的每列的數據類型都是在它們的文當中列出.用戶詞典Provider的各數據類型在它的契約類UserDictionary.Words(契約類在ContractClasses一節中講解)的參考文檔中列出.你也可以調用Cursor.getType()來確定數據類型.

Provider還為每個contentURI維護著MIME數據類型信息.你可以用MIME信息來確定你的應用是否能處理provider提供的信息,或基於MIME信息去選擇一個要處理的數據類型.當你使用包含復雜數據結構或文件的provider時,你經常需要MIME信息.例如,聯系人Provider中的表ContactsContract.Data用MIME類型來標志所存儲的聯系人數據的每行類據.要獲得一個contentURI的MIME類型,需調用ContentResolver.getType().

Thesection MIME類型參考一節描述瞭標準的和自定義的MIME類型語法.

 

 

操作Provider的三種型式
在應用開發中,有三種很重要的操作provider的型式:

Batchaccess:你可以使用ContentProviderOperation類的方法創建一批操作調用,然後使用ContentResolver.applyBatch()應用它們.

Asynchronousqueries: 你需要在另一個線程中執行請求.這樣做的一個辦法使用一個CursorLoader對象.在Loaders指南中的例子演示瞭如何做.

Dataaccess via intents:盡管你不能直接向一個provider發送intent,但你可以向provider的應用發送intent,這通常是修改provider'的數據的最佳方法.

通過intent批量操作和修改的方法在下面的章節中講解.

 

 

批操作

對一個provider的批操作在插入很大數量的行時很有用,也可以用於在一個方法調用中向多個表中插入多行,或用於將一系列操作作為一個事物執行時(一個原子操作).

要在"批模式"下操作一個provider,你需創建一個ContentProviderOperation對象的數組然後使用ContentResolver.applyBatch()把它派送到一個contentprovider.你應把contentprovider的authority而不是一般的contentURI傳給這個方法,authority允許數組中的每一個ContentProviderOperation對象作用於不同的表.對ContentResolver.applyBatch()的調用會返回一個數組存放結果.

契約類ContactsContract.RawContacts的描述中包含一個代碼片段演示瞭批插入.ContactManager應用例子包含瞭一個批操作的例子,在它的ContactAdder.java源碼文件中.

 

 

使用其它應用顯示數據

如果你的應用擁於操作權限,但你可能仍想使用一個intent在其它應用中顯示數據.例如,日歷應用接受一個ACTION_VIEWintent,然後顯示一個日期或事件.這使你可以顯示一個日期信息但不用自己創建界面.更多知識,請看CalendarProvider指南.

你發送intent的目標應用不一定必須是與provider相關連的應用.例如,你可以從聯系人Provider獲取一個聯系人,然後發送一個包含瞭聯系人圖像的contentURI的ACTION_VIEWintent到一個圖像顯示應用.

 

 

通過intent操作數據
Intents可以提供間接操作contentprovider的功能.於是你的應用可以操作不具有權限的provider中的數據.這既可以通過從有權限的應用中獲取一個返回的intent實現,也可以通過激活一個具有權限的應用來讓用戶操作方式來實現.

 

 

使用臨時權限操作

即使你不具有合適的權限,你還是可以操作contentprovider中的數據的,隻需把一個intent發送給一個具有權限的應用然後獲得一個返回的包含"URI"權限的intent即可.獲得的特定的URI的權限會一直持續到獲取它們的activity結束.那些具有權限的應用通過在要返回的intent中設置一個標志來賦與臨時權限:

讀權限:FLAG_GRANT_READ_URI_PERMISSION

寫權限:FLAG_GRANT_WRITE_URI_PERMISSION

註:這些標志不會給於對contentURI中包含的authority對應的provider的讀寫權限.操作僅僅針對URI本身.

一個provider在它的manifest中定義contentURI們的URI權限,使用<provider>元素的android:grantUriPermission屬性和<provider>子元素的<grant-uri-permission>屬性.URI權限機制在Securityand Permissions指南中的"URI權限"一節中做瞭詳細的描述.

例如,你可以從ContactsProvider中取得一個聯系人數據,即使你不具有READ_CONTACTS權限.你可能想在一個在某人生日時向他發送電子賀卡的應用中這樣做.你首選的是讓用戶僅控制你的應用使用的聯系人們,而不是直接請READ_CONTACTS權限以操作所有的聯系人和他們所有的信息.要這樣做,需執行以下過程:

你的應用發送一個intent,它包含瞭actionACTION_PICK和"contacts"MIME 類型CONTENT_ITEM_TYPE,使用方法startActivityForResult().

因為這個intent匹配瞭Peopleapp的"selection" activity,activity將被置於前臺.

在selectionactivity中,用戶選擇一個contact來更新.當這樣做時,selectionactivity調用setResult(resultcode,intent)來創建一個intent返回給你的應用.Intent中包含瞭用戶選擇的聯系人的contentURI和"extras"標志FLAG_GRANT_READ_URI_PERMISSION.這個標志賦與你的應用URI權限以從URI指定的聯系人中讀取數據.這個selectionactivity之後調用finish()將控制返回給你的應用.

你的activity返回到前臺,並且系統調用你的activity的onActivityResult()方法.這個方法接收被Peopleapp中的selectionactivity 創建並返回的intent.

使用返回的intent中的contentURI,你可以從ContactsProvider讀contactdata,即使你沒有在你的manifest中請求永久性的Provider讀權限.然後你就可以獲取聯系人的生日信息和他的email地址然後給他發送電子賀卡.

 

 

使用其它的應用

一個使用戶修改你的應用不具有權限的數據的簡單方法是激活一個有權限的應用,然後讓用戶在它正上進程操作.

舉個例子,日歷應用接收一個ACTION_INSERTintent,使你激活日歷應用的插入界面.你可以在這個intent中傳遞"額外的"數據,應用用它來預置界面.因為返回的事件具有復雜的語法,所以向日歷Provider中插入事件的最好的方式就是使用一個ACTION_INSERT激活Calendar應用然後讓用戶在它上面插入事件.

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。