1. 程式人生 > >Android 學習筆記 Contacts (一)ContentResolver query 引數詳解

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

1.獲取聯絡人姓名

一個簡單的例子,這個函式獲取裝置上所有的聯絡人ID和聯絡人NAME。

	public void fetchAllContacts() {
		ContentResolver contentResolver = this.getContentResolver();
		Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
				null, null, null, null);
		cursor.getCount();
		while(cursor.moveToNext()) {
			System.out.println(cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts._ID)));
			System.out.println(cursor.getString(cursor.getColumnIndex(android.provider.ContactsContract.Contacts.DISPLAY_NAME)));
		}
		cursor.close();
	}

執行結果:

11-05 14:13:09.987: I/System.out(4692): 13
11-05 14:13:09.987: I/System.out(4692): 張三
11-05 14:13:09.987: I/System.out(4692): 31
11-05 14:13:09.987: I/System.out(4692): 李四

解釋:

ContentResolver contentResolver = this.getContentResolver();

this在這裡指的是MainActivity,ContentResolver直譯為內容解析器,什麼東東?Android中程式間資料的共享是通過Provider/Resolver進行的。提供資料(內容)的就叫Provider,Resovler提供介面對這個內容進行解讀。

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

Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
				null, null, null, null);
根據Android文件,

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

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

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

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

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

Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
	new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME},
	android.provider.ContactsContract.Contacts.DISPLAY_NAME + "='張三'", null, null);
結果:
11-05 15:30:32.188: I/System.out(10271): 張三
第四個引數,selectionArgs,這個引數是要配合第三個引數使用的,如果你在第三個引數裡面有?,那麼你在selectionArgs寫的資料就會替換掉?,
Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
	new String[]{android.provider.ContactsContract.Contacts.DISPLAY_NAME},
	android.provider.ContactsContract.Contacts.DISPLAY_NAME + "=?",
				new String[]{"張三"}, null);

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

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

Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
				null, null,null, android.provider.ContactsContract.Contacts._ID + " DESC");
結果:
11-05 16:00:32.808: I/System.out(12523): 31
11-05 16:00:32.808: I/System.out(12523): 李四
11-05 16:00:32.817: I/System.out(12523): 13
11-05 16:00:32.817: I/System.out(12523): 張三
升序,其實預設排序是升序,+" ASC"寫不寫效果都一樣:
Cursor cursor = contentResolver.query(android.provider.ContactsContract.Contacts.CONTENT_URI,
				null, null,null, android.provider.ContactsContract.Contacts._ID + " ASC");
結果:
11-05 15:59:10.327: I/System.out(12406): 13
11-05 15:59:10.327: I/System.out(12406): 張三
11-05 15:59:10.327: I/System.out(12406): 31
11-05 15:59:10.327: I/System.out(12406): 李四

好了,終於搞定第一篇了,自己鼓勵一下!