Android 學習筆記 Contacts (一)ContentResolver query 參數詳解

1.獲取聯繫人姓名

一個簡單的例子,這個函數獲取設備上所有的聯繫人ID和聯繫人NAME。

[java] view plaincopy
  1. public void fetchAllContacts() {  
  2.     ContentResolver contentResolver = this.getContentResolver();  
  3.     Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,  
  4.             nullnullnullnull);  
  5.     cursor.getCount();  
  6.     while(cursor.moveToNext()) {  
  7.         System.out.println(cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID)));  
  8.         System.out.println(cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME)));  
  9.     }  
  10.     cursor.close();  
  11. }  

執行結果:

[java] view plaincopy
  1. 11-05 14:13:09.987: I/System.out(4692): 13  
  2. 11-05 14:13:09.987: I/System.out(4692): 張三  
  3. 11-05 14:13:09.987: I/System.out(4692): 31  
  4. 11-05 14:13:09.987: I/System.out(4692): 李四  

解釋:

[java] view plaincopy
  1. ContentResolver contentResolver = this.getContentResolver();  

this在這裏指的是MainActivity,ContentResolver直譯爲內容解析器,什麼東東?Android中程序間數據的共享是通過Provider/Resolver進行的。提供數據(內容)的就叫Provider,Resovler提供接口對這個內容進行解讀。

在這裏,系統提供了聯繫人的Provider,那麼我們就需要構建一個Resolver來讀取聯繫人的內容。

[java] view plaincopy
  1. Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,  
  2.                 nullnullnullnull);  
根據Android文檔,

public final Cursor query (Uri uri, String[] projection,String selection,String[] selectionArgs, StringsortOrder)

第一個參數,uri,rui是什麼呢?好吧,上面我們提到了Android提供內容的叫Provider,那麼在Android中怎麼區分各個Provider?有提供聯繫人的,有提供圖片的等等。所以就需要有一個唯一的標識來標識這個Provider,Uri就是這個標識,android.provider.ContactsContract.Contacts.CONTENT_URI就是提供聯繫人的內容提供者,可惜這個內容提供者提供的數據很少。

第二個參數,projection,真不知道爲什麼要用這個單詞,這個參數告訴Provider要返回的內容(列Column),比如Contacts Provider提供了聯繫人的ID和聯繫人的NAME等內容,如果我們只需要NAME,那麼我們就應該使用:

[java] view plaincopy
  1. Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,  
  2.     new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME}, nullnullnull);  
當然,下面打印的你就只能顯示NAME了,因爲你返回的結果不包含ID。用null表示返回Provider的所有內容(列Column)。

第三個參數,selection,設置條件,相當於SQL語句中的where。null表示不進行篩選。如果我們只想返回名稱爲張三的數據,第三個參數應該設置爲:

[java] view plaincopy
  1. Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,  
  2.     new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME},  
  3.     android.provider.ContactsContract.Contacts.DISPLAY_NAME + "='張三'"nullnull);  
結果:

[java] view plaincopy
  1. 11-05 15:30:32.188: I/System.out(10271): 張三  
第四個參數,selectionArgs,這個參數是要配合第三個參數使用的,如果你在第三個參數裏面有?,那麼你在selectionArgs寫的數據就會替換掉?,

[java] view plaincopy
  1. Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,  
  2.     new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME},  
  3.     android.provider.ContactsContract.Contacts.DISPLAY_NAME + "=?",  
  4.                 new String[]{"張三"}, null);  

效果和上面一句的效果一樣。

第五個參數,sortOrder,按照什麼進行排序,相當於SQL語句中的Order by。如果想要結果按照ID的降序排列:

[java] view plaincopy
  1. Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,  
  2.                 nullnull,null, android.provider.ContactsContract.Contacts._ID + " DESC");  
結果:

[java] view plaincopy
  1. 11-05 16:00:32.808: I/System.out(12523): 31  
  2. 11-05 16:00:32.808: I/System.out(12523): 李四  
  3. 11-05 16:00:32.817: I/System.out(12523): 13  
  4. 11-05 16:00:32.817: I/System.out(12523): 張三  
升序,其實默認排序是升序,+" ASC"寫不寫效果都一樣:

[java] view plaincopy
  1. Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,  
  2.                 nullnull,null, android.provider.ContactsContract.Contacts._ID + " ASC");  
結果:

[java] view plaincopy
  1. 11-05 15:59:10.327: I/System.out(12406): 13  
  2. 11-05 15:59:10.327: I/System.out(12406): 張三  
  3. 11-05 15:59:10.327: I/System.out(12406): 31  
  4. 11-05 15:59:10.327: I/System.out(12406): 李四  
發佈了6 篇原創文章 · 獲贊 5 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章