Android中的聯繫人都保存在一個SQLite數據庫中,有興趣的可使用adb直接push出來看一下里面的表和視圖的結構,html
它的路徑爲:/data/data/com.android.providers.contacts/databases/contacts2.dbjava
在聯繫人數據庫中,保存的都是一些小的數據表,即與把全部數據保存成一個表不一樣,它會對聯繫人的資料模塊化,而後分紅多個表保存。android
表與表之間使用id相關聯起來,這樣作的目的是儘可能減少數據表的規模,提升數據檢索的速度,由於咱們檢索的時候不是每次都須要讀取全部的聯繫人資料的,這樣能夠更靈活的選擇咱們所關心的內容,提升檢索速度,web
雖然分開的保存數據,能夠提升檢索的速度,可是也給咱們帶來了一些不便,就是須要把這些分開的表再從新聯合起來,組成咱們所須要的完整的數據。好在這些,android已經替咱們準備好了,它在數據庫裏面建了一些視圖,呵呵,視圖就是虛擬表。而且,android也提供了不少接口,經過ContentResolver().query方法,傳入不一樣的URI便可訪問相應的數據集。數據庫
在聯繫人數據庫裏面聯繫人和電話號碼是分別存在兩個表裏面的,由於存在一個聯繫人擁有幾個號碼的狀況,因此android爲聯繫人和手機號碼分別單首創建了相應的視圖。ide
聯繫人信息的視圖裏面只保存與聯繫人相關的資料,例如姓名,是否有手機號碼等。模塊化
而手機號碼資料則是每個電話號碼爲一條記錄,若是有一個聯繫人有3個號碼,則裏面會出現3個該聯繫人的記錄,號碼分別爲他的三個號碼。函數
若是是須要讀取聯繫人信息,傳入的URI爲:ContactsContract.Contacts.CONTENT_URI字體
若是是須要讀取手機號碼信息傳入的URI爲:ContactsContract.CommonDataKinds.Phone.CONTENT_URIthis
下面再看看query函數的原型,只讀取關心的字段,應該能夠提升一點速度
query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
projection:是須要讀取的字段
selection:是數據檢索的條件
selectionArgs:是數據檢索條件的參數
sortOrder:是排序的字段
在android聯繫人表裏面一個兩個比較有意思的字體sort_key和sort_key_alt,它裏面保存的是聯繫人名字的拼音字母,
例如聯繫人名字是「李明」,則sort_key保存的是「LI李MING明」,這樣若是是按sort_key或sort_key_alt排序的話,就能夠實現按漢字的拼音字母排序了,,,
下面給讀取系統全部聯繫人的代碼片斷,讀取全部的聯繫人,而後每讀一個聯繫人,再把該聯繫人的全部號碼讀出來
(這個由於須要不斷的去檢索數據庫,因此會很慢,你們有什麼方法提升SQLite數據庫的檢索的方法沒??):
-
- String[] selectCol = new String[]{
- ContactsContract.Contacts.DISPLAY_NAME,
- ContactsContract.Contacts.HAS_PHONE_NUMBER,
- ContactsContract.Contacts._ID
- };
- public static final int COL_NAME = ;
- public static final int COL_HAS_PHONE = 1;
- public static final int COL_ID = 2;
-
-
- String[] selPhoneCols = new String[] {
- ContactsContract.CommonDataKinds.Phone.NUMBER,
- ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
- ContactsContract.CommonDataKinds.Phone.TYPE
- };
- public static final int COL_PHONE_NUMBER = ;
- public static final int COL_PHONE_NAME = 1;
- public static final int COL_PHONE_TYPE = 2;
-
-
- public void getContactList() {
- String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("
- + Contacts.HAS_PHONE_NUMBER + "=1) AND ("
- + Contacts.DISPLAY_NAME + " != '' ))";
-
- list = new ArrayList<ContactItemData>();
- Cursor cursor = this.getContentResolver().query(
- ContactsContract.Contacts.CONTENT_URI, selectCol, select, null,
- ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");
- if (cursor ==null) {
- Toast.makeText(this, "cursor is null!", Toast.LENGTH_LONG).show();
- return;
- }
- if (cursor.getCount() == ) {
- Toast.makeText(this, "cursor count is zero!", Toast.LENGTH_LONG).show();
- return;
- }
-
-
- cursor.moveToFirst();
- while(!cursor.isAfterLast()) {
- int contactId;
- contactId = cursor.getInt(cursor.getColumnIndex(
- ContactsContract.Contacts._ID));
- if (cursor.getInt(COL_HAS_PHONE)>) {
-
-
- String displayName;
- displayName = cursor.getString(COL_NAME);
- Cursor phoneCursor = getContentResolver().query(
- ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
- selPhoneCols,
- ContactsContract.CommonDataKinds.Phone.CONTACT_ID
- + "=" + contactId, null, null);
- if(phoneCursor.moveToFirst()) {
- do
- {
-
- String phoneNumber = phoneCursor.getString(COL_PHONE_NUMBER);
-
- ContactItemData data = new ContactItemData();
- String phoneFiled = new String();
- data.name = displayName;
- data.number = phoneFiled + ":" + phoneNumber;
- data.check = false;
- list.add(data);
- }while(phoneCursor.moveToNext());
- }
- }
- cursor.moveToNext();
- }
- }
讀取全部號碼的片斷:
-
-
-
-
-
- String[] selPhoneCols = new String[] {
- ContactsContract.CommonDataKinds.Phone.NUMBER,
- ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
- ContactsContract.CommonDataKinds.Phone.TYPE,
- ContactsContract.CommonDataKinds.Phone.LABEL,
- ContactsContract.CommonDataKinds.Phone._ID
- };
- public static final int COL_PHONE_NUMBER = ;
- public static final int COL_PHONE_NAME = 1;
- public static final int COL_PHONE_TYPE = 2;
- public static final int COL_PHONE_LABEL = 3;
-
- public ContactsCursorAdapter getContactCursorList() {
- String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("
- + Contacts.DISPLAY_NAME + " != '' ) AND ("
- + ContactsContract.CommonDataKinds.Phone.NUMBER + " NOTNULL) AND ("
- + ContactsContract.CommonDataKinds.Phone.NUMBER + " != ''))";
-
- Cursor cursor = this.getContentResolver().query(
- ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
- selPhoneCols, select, null,
- "sort_key_alt"
- );
- ContactsCursorAdapter adapter = new ContactsCursorAdapter(this,
- R.layout.contact_item, cursor);
- return adapter;
- }