不一樣於文件和SharedPreferences存儲中的兩種全局讀寫操做,內容提供器能夠選擇只對哪一部分數據進行共享,防止數據不會泄露。java
ContentResolver類android
List<String> contactsList = new ArrayList<String>(); private void readContacts() { Cursor cursor = null; try { // 查詢聯繫人數據 cursor = getContentResolver().query( ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null, null, null, null); while (cursor.moveToNext()) { // 獲取聯繫人姓名 String displayName = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); // 獲取聯繫人手機號 String number = cursor.getString(cursor.getColumnIndex( ContactsContract.CommonDataKinds.Phone.NUMBER)); contactsList.add(displayName + "\n" + number); } } catch (Exception e) { e.printStackTrace(); } finally { if (cursor != null) { cursor.close(); } }
使用了query()方法,傳入uri參數。而後對Cursor對象進行遍歷,最後關閉。app
固然還須要相應的權限ide
<uses-permission android:name="android.permission.READ_CONTACTS" />
就像寫個接口同樣,提供相應路徑,訪問我,就給你相應的數據。code
extends ContentProvider
標準的URI寫法:xml
content://com.example.app.provider/table1對象
*:表示匹配任意長度的任意字符 #:表示匹配任意長度的數字接口
content://com.example.app.provider/*字符串
那麼誰來實現匹配內容URI呢: UriMatcherget
提供了一個addURI() 方法,接收三個參數: 權限、路徑、自定義的代碼
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI("com.example.app.provider", "table1", 0);
獲取 Uri 對象所對應的 MIME 類型,一個內容 URI 所對應的 MIME字符串主要由三部分組分
vnd.android.cursor.dir/vnd.com.example.app.provider.table1
內容提供器在 AndroidManifest.xml 文件中註冊
<provider android:name="自定義內容提供器的全名" android:authorities="包名.provider" > </provider>
如何去訪問自定義的內容提供器呢?
Uri uri = Uri.parse("content://com.example.app.provider/table1"); //查所有 ,到這一步就很熟悉了,遍歷取出數據。 Cursor cursor = getContentResolver().query(uri, null, null,null, null);