2011-03-30 89 views
1

我試圖檢索顯示名稱和所有我的聯繫人的電話號碼,但我希望它只返回有數字的行。Android獲取聯繫人姓名和號碼查詢

目前我有像這樣和它的作品:

ContentResolver cr = getContentResolver(); 
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,null, null, ContactsContract.Contacts.DISPLAY_NAME+ " COLLATE NOCASE"); 
while (cur.moveToNext()) 
{   
    if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) 
    { 
         String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); 
         String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));      
         contacts[index] = name;         

         Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null); 
         pCur.moveToFirst();         
         numbers[index] = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
         index++; 
         pCur.close(); 
     } 

的事情是,它需要像4-5秒,因爲它是運行cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);像400次加載。


現在我的理解是,聯繫人的姓名和號碼保存在不同的表格中,並且您需要姓名的編號以獲取號碼。

這可以以任何其他方式更快地完成嗎?

在此先感謝

回答

5

@mixkat 我已經想出了一個更多的解決方案。

僅使用一個查詢就可以獲取姓名和電話號碼。

下面是代碼:

String WHERE_CONDITION = ContactsContract.Data.MIMETYPE + " = '" + ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE + "'"; 
    String[] PROJECTION = {ContactsContract.Data.DISPLAY_NAME, ContactsContract.Data.DATA1}; 
    String SORT_ORDER = ContactsContract.Data.DISPLAY_NAME; 

    Cursor cur = context.getContentResolver().query(
      ContactsContract.Data.CONTENT_URI, 
      PROJECTION, 
      WHERE_CONDITION, 
      null, 
      SORT_ORDER); 

在這種情況下,您查詢沒有直接聯繫供應商,而是數據提供商。

+0

@Maxim謝謝你回答一個老話題!你確定嗎? – mixkat 2011-04-28 14:42:14

+0

@mixkat我這麼認爲。遊標有兩列。 [0] - 顯示名稱[1] - 電話號碼。我檢查了它適用於我。 – Maxim 2011-04-28 14:54:18

+0

@Maxim對我來說,它會爲所有聯繫人返回相同的號碼! – mixkat 2011-04-28 15:11:04

1

我有同樣的問題。我通過在db第一次用戶打開的應用程序中保存聯繫人來解決它。並且比我更新數據(當應用程序更新聯繫人時由您決定)。

因此,應用程序使用我的數據庫表中的姓名和號碼在一行中的聯繫人。這需要更少的時間。

+0

是的,我也這麼想!但是沒有其他方法嗎?我可能需要每次需要更新數字列表時(即每次調用特定方法時),因爲自上次更新以來聯繫人可能已發生變化,所以對我來說這不是真正的解決方案! – mixkat 2011-03-30 12:36:41

+0

@mixkat此鏈接可能是有用的[鏈接] http://stackoverflow.com/questions/1401280/how-to-listen-for-changes-in-contact-database – Maxim 2011-03-30 12:46:03

+0

是啊看起來不錯...我會嘗試謝謝! – mixkat 2011-03-31 19:46:53

相關問題