ContentProvider的基礎使用
ContentProvider是什麼
ContentProvider, 內容提供者,它管理Android以,結構化方式存放的數據,它以相對安全的方式封裝數據並且提供簡易的處理機制。ContentProvider提供不同進程間數據交互的標準化接口,是應用程序之間共享數據的一種接口機制,是一種更爲高級的數據共享方法。
- ContentProvider可以指定需要共享的數據,而其他應用程序則可以在不知道數據來源、路徑的情況下,對共享數據進行增刪改查等操作
- 在Android系統中,許多Android系統內置的數據也是通過ContentProvider提供給用戶使用,例如通訊錄、音視頻文件和圖像文件等
ContentProvider,Uri,ContentResolver
ContentProvider是允許不同應用進行數據交換的標準的API,ContentProvider以Uri的形式對外提供數據的訪問操作接口,而其他應用則通過ContentResolver根據Uri去訪問指定的數據。
一旦某個應用通過ContentProvider暴露了自己的數據接口,那麼不管該應用程序是否啓動,其他程序都可以通過該接口來操作自己的數據接口來操作其內部的數據,包括增加數據,刪除數據,修改數據,查詢數據等.
Uri——通用資源標識符(Uniform Resource Identifier)
是一個用於標識某一互聯網資源名稱的字符串 該種標識允許用戶對任何(包括本地和互聯網)的資源通過特定的協議進行交互操作。URI由包括確定語法和相關協議的方案所定義
Uri由三個部分:訪問資源的命名機制(ContentProvider的默認爲content)、存放資源的主機名、資源自身的名稱組成,使用的URI語法結構如下:
content://<authority>/<data_path>/<id>
- content:// 使用的是content協議,屬於默認規定
- < authority > 是授權者名稱,用來確定具體由哪一個ContentProvider提供資源,通常是類的小寫,以確保資源授權者的唯一性。
- < data_path > 是數據路徑,用來確定請求的是哪個數據集。
- < id > 是數據編號,用來唯一確定數據集中的一條記錄,匹配數據集中_ID字段的值(如果請求的數據不只一條,< id >可以省略)。
ContentProvider的使用離不開Uri類的支持,在自己的繼承類中使用UriMatcher,根據UriMatcher.match(Uri uri)返回的表示符,進行不同範圍,不同數據集的操作。
ContentResolver(內容解析器)
外界的程序通過ContentResolver可以訪問ContentProvider提供的數據;
一旦定義好自己的ContentProvider類,就可以使用ContentResolver進行訪問操作了。ContentResolver類的方法都會在其內部調用URI主機部分確定的ContentProvider,ContentProvider實現了底層數據的增,刪,查,改的功能.
使用:
Cursor cs = getContentResolver().query();
具體操作與數據庫query方法相同
系統常用Uri
android系統管理聯繫人的URI如下:
ContactsContract.Contacts.CONTENT_URI
管理聯繫人的Uri
ContactsContract.CommonDataKinds.Phone.CONTENT_URI
管理聯繫人的電話的Uri
ContactsContract.CommonDataKinds.Email.CONTENT_URI
管理聯繫人的Email的Uri
(注:Contacts有兩個表,分別是rawContact和Data,rawContact記錄了用戶的id和name,data表中有Email的信息)
- 其中id欄名稱爲:
ContactsContract.Contacts._ID
- name名稱欄爲
ContactContract.Contracts.DISPLAY_NAME
- 電話信息表的外鍵id爲
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
電話號碼欄名稱爲:
ContactsContract.CommonDataKinds.Phone.NUMBER.
.Email地址欄名稱爲:
ContactsContract.CommonDataKinds.Email.DATA
- 其外鍵欄爲:
ContactsContract.CommonDataKinds.Email.CONTACT_ID
android爲多媒體提供的ContentProvider的Uri如下:
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI
存儲在sd卡上的音頻文件
MediaStore.Audio.Media.INTERNAL_CONTENT_URI
存儲在手機內部存儲器上的音頻文件
MediaStore.Audio.Images.EXTERNAL_CONTENT_URI
SD卡上的圖片文件內容
MediaStore.Audio.Images.INTERNAL_CONTENT_URI
手機內部存儲器上的圖片
MediaStore.Audio.Video.EXTERNAL_CONTENT_URI
SD卡上的視頻
MediaStore.Audio.Video.INTERNAL_CONTENT_URI
手機內部存儲器上的視頻
短信URI: Content://sms
發送箱中的短信URI: Content://sms/outbox
(相應欄名稱address, subject(標題), time)
最後記得在AndroidManifest.xml聲明讀寫權限:
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.WRITE_CONTACTS" />
自定義ContentProvider
這個我暫時還沒用過,等我用過了我再補上