2011-03-05 48 views
15

我有以下代碼從content providerAndroid的一個光標只能與中列出的電子郵件聯繫人> Android 2.0的

String[] columns = new String[] { 
       ContactsContract.Contacts.DISPLAY_NAME, 
       ContactsContract.Contacts._ID, 
       ContactsContract.Contacts.PHOTO_ID }; 
     Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI, 
       columns, null, null, null); 

得到接觸,我用這個來獲取電子郵件,通過特定的聯繫人的我的當前實現傳遞遊標中的每一行並獲取其電子郵件並將它們存儲在java對象的arrayList中。

什麼,我想知道是否有可能做的僅僅是查詢內容提供商和返回與IDS /名稱等,具有列出的電子郵件地址剛剛接觸的光標。

這樣有越來越聯繫人列表中的等待時間過長。我使用這個列表作爲列表適配器。如果我能得到的只是有一個電子郵件聯繫人我可以在列表中使用遊標適配器。

是這樣的可能嗎?我怎樣才能加快這個過程?

回答

10

我解決了這一個,這裏是它如何做的:

UPDATE

String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, 
     ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID, 
     Email.DATA, ContactsContract.CommonDataKinds.Photo.CONTACT_ID }; 

    String order = " CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME 
     + " NOT LIKE '%@%' THEN 1" + " ELSE 2 END, " 
     + ContactsContract.Contacts.DISPLAY_NAME + " COLLATE NOCASE"; 
    String filter = Email.DATA + " NOT LIKE '') GROUP BY (" + Email.DATA; 

    return mContent.query(Email.CONTENT_URI, 
         PROJECTION, filter, null, order); 
+11

可以添加侑完整的代碼..? – 2011-03-23 10:53:55

+0

helloo即時通訊面臨同樣的問題,所以,PLZ在這裏添加您的代碼.. – 2011-03-24 04:52:05

+0

@CapDroid在一些舊的代碼中發現此問題,其餘 – DArkO 2013-01-09 07:49:12

17

@CapDroid

固定的工作代碼達科的帖子:

ContentResolver cr = context.getContentResolver(); 
    String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, 
      ContactsContract.Contacts.DISPLAY_NAME, 
      ContactsContract.Contacts.PHOTO_ID, 
      ContactsContract.CommonDataKinds.Email.DATA, 
      ContactsContract.CommonDataKinds.Photo.CONTACT_ID }; 
    String order = "CASE WHEN " 
      + ContactsContract.Contacts.DISPLAY_NAME 
      + " NOT LIKE '%@%' THEN 1 ELSE 2 END, " 
      + ContactsContract.Contacts.DISPLAY_NAME 
      + ", " 
      + ContactsContract.CommonDataKinds.Email.DATA 
      + " COLLATE NOCASE"; 
    String filter = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE ''"; 
    Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, order); 

你遊標將具有必要的ID以及名稱d電子郵件地址。這段代碼的性能很好,因爲它只需要很少的列。

+0

什麼是訂單的東西? – gyosida 2014-12-24 15:18:18

+4

使這項工作在我的LG G3,我不得不修改過濾器「<>‘’」,而不是「NOT LIKE'」 – AndreasEK 2015-04-08 12:38:18

相關問題