內容提供器是Android中實現跨程序共享數據的標準方式,內容提供器主要用于在不同的應用程序之間實現數據共享的功能,它提供了一套完整的機制,允許一個程序訪問另一個程序中的數據,同時還能保證被訪問數據的安全性
內容提供器的用法有兩種:
- 使用現有的內容提供器來讀取和操作相應程序中的數據
- 創建自己的內容提供器給我們程序的數據提供外部訪問接口
當一個應用程序通過內容提供器對其數據提供了外部訪問接口,任何其他的應用程序就都可以對這部分數據進行訪問**
對于每一個應用程序來說,如果想要訪問內容提供器中共享的數據中,就一定要借助ContentResolver
類,此類可以通過Context
中的getContentResolver()
方法獲取到其實例對象,其內部提供了一系列方法進行CRUD操作(和數據庫打交道)**
內容提供器中的URI
內容URI
內容URI給內容提供器中的數據建立唯一的標識符,同時也是
ContentResolver
類進行CURD操作的所需參數之一
內容URI由兩部分組成:
- 權限<authority>:用于對不同的應用程序進行區分。一般情況下,都會采用程序的包名進行區分
-
路徑<path>:用于對同一應用程序中不同的表做區分,添加在去權限的后面。一般情況下,使用表名
再在字符串的頭部加上協議聲明,故內容URI的標準格式如下:
content://com.example.app.provider/table1
我們可以在內容URI的后面加上一個id:
content://com.example.app.provider/table1/1
表示調用方期望訪問的是com.example.app這個應用的table表中id為1的數據。
兩種格式的內容URI:
- 以路徑結尾就表示期望訪問該表中所有的數據
- 以id結尾表示期望訪問該表中擁有響應id的數據
可以使用通配符的方式來分別匹配這兩種格式的內容URI:
- “*” :表示匹配任意長度的任意字符
- “#”:表示匹配任意長度的數字
例:
- 一個能匹配任意表的內容URI格式就可以寫成:
content://com.example.app.provider/*
- 一個能匹配table1表中任意一行數據的內容URI就可以寫成:
content://com.example.app.provider/table1/#
得到了內容URI字符串,我們需要將之解析成Uri對象才可以做為參數傳入:
Uri uri = Uri.parse("content://com.example.app.provider/table1");
創建自己的內容提供器時使用到的getType()方法
根據傳入的內容URI來返回相應的MIME類型,所有的內容提供器都必須提供的一個方法
內容URI對應的MIME字符串主要由三部分組成:
- 必須以
vnd
開頭 - 如果內容URI以路徑結尾,則后接
android.cursor.dir/
,如果內容以id結尾,則后接android.cursor.item/
- 最后接上
vnd.<authority>.<path>
例:
對于content://com.example.app.provider/table1
內容URI,對應的MIME類型就可以寫成:
vnd.android.cursor.dir/vnd.com.example.provider.table1
對于content://com.example.app.provider/table1/1
內容URI,對應的MIME類型就可以寫成:
vnd.android.cursor.item/vnd.com.example.provider.table1